Java 프로세스간 통신방법(IPC) 없나요?
글쓴이: 버그소년 / 작성시간: 금, 2005/07/08 - 6:07오후
리눅스에서 C로만 개발을 해 오다, 갑작스레 자바로 개발을 하게 됐습니다.
자바에대한 제반지식이 전무한 상태에서 접근하려니 어렵네요.
같은 장비에서 동작하는 두개의 프로세스간 통신을 하려고합니다.
프로세스간 통신을 위해 소켓을 쓰는것이 여러방면으로 마음에 들지 않는군요.
자바(JVM)에서 공유메모리나 메시지큐같이 프로세스간 통신을 할 수 있는지 궁금합니다.
추가로, pthread_cond_wait (...) , pthread_cond_signal (...)
위와같은 기능을 할 수 있는 방법이 있는지 궁금합니다.
쓰레드를 여러개 생성시킨 후 모든 쓰레드가 대기상태로 있고,
원하는 쓰레드만을 골라 대기상태를 해제시켜 실행시키고 싶습니다.
Thread클래스의 suspend (), resume ()이 있던데 이것은 사용하지 말라고 되어있네요..(왜인지는 잘 이해를 못해서...)
Forums:
소켓은 어떤지?
소켓은 어떤지?
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
비슷한 문제로 포켓피씨에서 고민했던 사람입니다.소켓을 결국 사용하
비슷한 문제로 포켓피씨에서 고민했던 사람입니다.
소켓을 결국 사용하긴 했지만
몇개의 프로그램이 추가될지도 모르고 미리 컴파일된 프로그램들은
상대방의 포트를 알 수 없는 상황에서는
다이내믹하게 포트를 알리고 매핑하는 것이 지랄이더군요.
어영부영 덥고 넘어가긴 했습니다만
뭔가 괜찮은 방식이 없었을까요?
Zeroconf를 사용해 보세요
소켓을 이용하시고, 상대방의 소켓을 알아내기 위한 수단으로는 Zeroconf의 Multicast-DNS와 DNS service discovery를 (자바버전은 http://jmdns.sourceforge.net/ ) 를 사용해 보세요.
Thread는
wait, notify를 사용하시면 됩니다.
정확한 코드는 아닙니다만, 대충 다음과 같이 될겁니다.
class Worker extends Thread {
public synchronized void run(){
while(true) {
wait();
doSomething();
}
}
...
}
이런식으로 쓰래드를 만드시고..
Worker w1 = new Worker();
w1.start();
....
하시고 일을 시키고 싶을때면
w1.notify();
를 해주시면 됩니다.
C/C++ 로 IPC를 수행할수 있는 라이브러리를 만들어서JNI로 콜
C/C++ 로 IPC를 수행할수 있는 라이브러리를 만들어서
JNI로 콜해 보심이 어떨까요. :D
http://www.codeguru.com/forum/showthread.php?t=344705
이왕 자바 하시는거 이 쪽을 좀 보셔도 될 듯Doug Lea라는 분의
이왕 자바 하시는거 이 쪽을 좀 보셔도 될 듯
Doug Lea라는 분의 홈페이지에서 ( http://gee.cs.oswego.edu/ )
이쪽을 보시면
http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html
모범적인 코드들을 구경할 수 있습니다.
------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.
답변 감사드립니다.자바를 사용하려는 이유가 컴파일된 .class파
답변 감사드립니다.
자바를 사용하려는 이유가 컴파일된 .class파일만 설치하면 바로
사용할 수 있도록 하기위함입니다.
C로 제작된 라이브러리를 JNI로 불러쓴다면 해당하는 C라이브러리 역시
각 플랫폼마다 컴파일하여 관리해야하므로 우선 제외했습니다.
결과적으로 소켓 말고는 통신방법이 없다는 얘기같은데... 고민되는군요.
그리고 narusas님께서 알려주신 방법대로 wait, notify를 테스트 해 봤는데,
wait는 잘 동작하는듯 한데 main함수에서 notify를 호출하면
이런 메세지가 뜨는군요... 쓰레드는 대기상태로 계속 있고요..
mach님께서 알려주신 곳의 자료는 이번 작업을 하면서 많은 도움이 될듯 합니다.
모두들 감사드립니다.
가끔은 밥을 굶어도 살 수 있다.
대기와 통지...
음. 잘동작하는 대기와 통지를 사용하는 코드를 하나 보여드릴께요..
public class BusyFlag {
protected Thread busyflag = null;
protected int busyCount = 0;
public synchronized void getBusyFlag() {
while(tryGetBusyFlag() == false ) {
try {
wait();
} catch(Exception ex){}
}
}
public synchronized boolean tryGetBusyFlag() {
if (bysyflag == null) {
bufyflag = Thread.currentThread();
busyCount = 1;
return true;
}
if (bufyflag == Thread.currentThread() ) {
busyCount ++;
return true;
}
return false;
}
public synchronized void freeBufyFlag() {
if (getBysyFlagOwner() == Thread.currentThread() ) {
busyCount --;
if ( busyCount ==0 ) {
busyflag = null;
notify();
}
}
}
public synchronized Thread getBufyFlagOwner() {
return busyflag;
}
}
이 클래스는 어떤 쓰래드에서 getBusyFlag()를 호출했을때 이미 다른 쓰래드에서 가져가서 사용중이라면 wait()시키고, 다른 쓰래드가 사용을 종료하면 기다리던 쓰래드에 notify()하여 사용할수 있게 하는 역활을 합니다.
댓글 달기