java模块间怎么进行信息传递方式_java的线程之间如何进行消息传递

匿名用户

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();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值