匿名用户
1级
2011-09-29 回答
原生Java线程之间只能通过共享内存(同一个虚拟机内)来通信。当然你可以通过自己实现,使得线程看起来可以通过消息通信。比如Scala的Actor,可以通过消息传递,但Actor本身和线程是有很大不同,不过看起来具备了一些线程功能 。
追问:
我想实现的是这样的, 比如Thread1发个消息给Thread2, 内容是让Thread2干A事,Thread2接到这个消息,就开始干A事。这应该是异步的,如果通过共享内存怎么实现呢,如果自己实现,应该怎么实现? 谢谢啊
追答:
这可以有很多种实现方式,比如可以用CountDownLatch,初始时用await阻塞线程2,当Thread1做完事情之后打开这个latch(一般叫闭锁)。还可有用信号量,或者CycleBarrier之类的数据结构。
如果实现一套简单消息传递机制,可以抽象出一个Actor,附带一个mailbox(可以是一个BlockingQueue),它是一个Runnable,它的任务是不断扫描mailbox里的消息并处理。Thread2也可以抽象出一个Actor,它的任何很简单,做自己的事,并在完成后把消息放到Thread1的mailbox里。两个Runnable可以用JDK线程池自动调度
追问:
对不起我比较菜 没太明白,我这里面thread1 和thread2是同等地位的,它们都从事这自己的事情,但是当thread1发消息给thread2时,thread2收到消息就开始做thread1叫它做的事。如果用mailbox,你可以告诉我代码吗? 谢谢啦。
追答:
这里没必要实现复杂的消息机制,我写个简单的代码给你
public static void main(String[] args) {
class Thread1 extends Thread {
private BlockingQueue mailbox;
/**
*
*/
public Thread1(BlockingQueue mailbox) {
this.mailbox = mailbox;
}
public void run() {
try {
Object message = mailbox.take();
System.out.println(message);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
}
class Thread2 extends Thread {
private BlockingQueue sendBuffer;
/**
*
*/
public Thread2(BlockingQueue sendBuffer) {
this.sendBuffer = sendBuffer;
}
@Override
public void run() {
try {
System.out.println("sending message hello to another thread");
sendBuffer.put("hello");
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
BlockingQueue queue = new LinkedBlockingQueue();
Thread t1 = new Thread1(queue);
Thread t2 = new Thread2(queue);
t1.run();
t2.run();
}