Java 프로세스간 통신방법(IPC) 없나요?

버그소년의 이미지

리눅스에서 C로만 개발을 해 오다, 갑작스레 자바로 개발을 하게 됐습니다.

자바에대한 제반지식이 전무한 상태에서 접근하려니 어렵네요.

같은 장비에서 동작하는 두개의 프로세스간 통신을 하려고합니다.

프로세스간 통신을 위해 소켓을 쓰는것이 여러방면으로 마음에 들지 않는군요.

자바(JVM)에서 공유메모리나 메시지큐같이 프로세스간 통신을 할 수 있는지 궁금합니다.

추가로, pthread_cond_wait (...) , pthread_cond_signal (...)

위와같은 기능을 할 수 있는 방법이 있는지 궁금합니다.

쓰레드를 여러개 생성시킨 후 모든 쓰레드가 대기상태로 있고,

원하는 쓰레드만을 골라 대기상태를 해제시켜 실행시키고 싶습니다.

Thread클래스의 suspend (), resume ()이 있던데 이것은 사용하지 말라고 되어있네요..(왜인지는 잘 이해를 못해서...)

mach의 이미지

소켓은 어떤지?

------------------ P.S. --------------
지식은 오픈해서 검증받아야 산지식이된다고 동네 아저씨가 그러더라.

galien의 이미지

비슷한 문제로 포켓피씨에서 고민했던 사람입니다.

소켓을 결국 사용하긴 했지만

몇개의 프로그램이 추가될지도 모르고 미리 컴파일된 프로그램들은

상대방의 포트를 알 수 없는 상황에서는

다이내믹하게 포트를 알리고 매핑하는 것이 지랄이더군요.

어영부영 덥고 넘어가긴 했습니다만

뭔가 괜찮은 방식이 없었을까요?

익명 사용자의 이미지

소켓을 이용하시고, 상대방의 소켓을 알아내기 위한 수단으로는 Zeroconf의 Multicast-DNS와 DNS service discovery를 (자바버전은 http://jmdns.sourceforge.net/ ) 를 사용해 보세요.

narusas의 이미지

wait, notify를 사용하시면 됩니다.
정확한 코드는 아닙니다만, 대충 다음과 같이 될겁니다.

class Worker extends Thread {
public synchronized void run(){
while(true) {
wait();
doSomething();
}
}
...
}

이런식으로 쓰래드를 만드시고..

Worker w1 = new Worker();
w1.start();
....

하시고 일을 시키고 싶을때면
w1.notify();
를 해주시면 됩니다.

kihongss의 이미지

C/C++ 로 IPC를 수행할수 있는 라이브러리를 만들어서
JNI로 콜해 보심이 어떨까요. :D

Quote:
for that purpose look into JNI - Java Native Interface
it's a way to load perform native calls from java

one way to do this in your situation (if I understand your problem)
is to build a native library in C/C++ and that load it from java app and perform method/function calls. library should perform the IPC actually.

maybe you could use sockets?

http://www.codeguru.com/forum/showthread.php?t=344705

mach의 이미지

이왕 자바 하시는거 이 쪽을 좀 보셔도 될 듯
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파일만 설치하면 바로

사용할 수 있도록 하기위함입니다.

C로 제작된 라이브러리를 JNI로 불러쓴다면 해당하는 C라이브러리 역시

각 플랫폼마다 컴파일하여 관리해야하므로 우선 제외했습니다.

결과적으로 소켓 말고는 통신방법이 없다는 얘기같은데... 고민되는군요.

그리고 narusas님께서 알려주신 방법대로 wait, notify를 테스트 해 봤는데,

wait는 잘 동작하는듯 한데 main함수에서 notify를 호출하면

Quote:
java.lang.IllegalMonitorStateException: current thread not owner
at java.lang.Object.notify(Native Method)
at ReaderTest.ReaderTest.main(ReaderTest.java:75)

이런 메세지가 뜨는군요... 쓰레드는 대기상태로 계속 있고요..

mach님께서 알려주신 곳의 자료는 이번 작업을 하면서 많은 도움이 될듯 합니다.

모두들 감사드립니다.

가끔은 밥을 굶어도 살 수 있다.

narusas의 이미지

버그소년 wrote:
답변 감사드립니다.

자바를 사용하려는 이유가 컴파일된 .class파일만 설치하면 바로

사용할 수 있도록 하기위함입니다.

C로 제작된 라이브러리를 JNI로 불러쓴다면 해당하는 C라이브러리 역시

각 플랫폼마다 컴파일하여 관리해야하므로 우선 제외했습니다.

결과적으로 소켓 말고는 통신방법이 없다는 얘기같은데... 고민되는군요.

그리고 narusas님께서 알려주신 방법대로 wait, notify를 테스트 해 봤는데,

wait는 잘 동작하는듯 한데 main함수에서 notify를 호출하면

Quote:
java.lang.IllegalMonitorStateException: current thread not owner
at java.lang.Object.notify(Native Method)
at ReaderTest.ReaderTest.main(ReaderTest.java:75)

이런 메세지가 뜨는군요... 쓰레드는 대기상태로 계속 있고요..

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()하여 사용할수 있게 하는 역활을 합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.