Rom*_*eau 17
消息传递在Java中
当线程将消息(对象)发送到另一个线程时.
用于其中的线程没有共享存储器因此,线程不能共享信号量或监视器和不能使用共享变量进行通信的环境中线程通信和同步.当然,仍然可以在共享内存平台中使用消息传递.
消息通过具有诸如发送(信道,消息)之类的操作的信道发送,并且通过诸如接收(信道,消息)之类的操作从信道接收.消息可以同步传递,这意味着发送方阻塞,直到接收到接收,接收方阻塞,直到发送方发送.由于发送器和接收器在特定的已知点在其代码在已知的时间特定的瞬间,同步消息传递也被称为用的信息从发送者到接收器的单向流动的简单会合.一个例子是国际象棋游戏代理.代理可以同步处理消息,因为它们将在整个游戏中进行握手.
在异步消息传递中,发件人不会阻止.如果没有接收方等待接收消息,则消息排队或缓冲.如果在执行接收时没有排队或缓冲的消息,接收器仍会阻塞.
T.T*_*.T. 12
两个线程之间的经典交互:生产者和消费者.
import java.util.Vector;
class Producer extends Thread {
static final int MAXQUEUE = 5;
private Vector messages = new Vector();
public void run() {
try {
while ( true ) {
putMessage();
sleep( 1000 );
}
}
catch( InterruptedException e ) { }
}
private synchronized void putMessage()
throws InterruptedException {
while ( messages.size() == MAXQUEUE )
wait();
messages.addElement( new java.util.Date().toString() );
notify();
}
// Called by Consumer
public synchronized String getMessage()
throws InterruptedException {
notify();
while ( messages.size() == 0 )
wait();
String message = (String)messages.firstElement();
messages.removeElement( message );
return message;
}
}
class Consumer extends Thread {
Producer producer;
Consumer(Producer p) {
producer = p;
}
public void run() {
try {
while ( true ) {
String message = producer.getMessage();
System.out.println("Got message: " + message);
sleep( 2000 );
}
}
catch( InterruptedException e ) { }
}
public static void main(String args[]) {
Producer producer = new Producer();
producer.start();
new Consumer( producer ).start();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
33443 次 |
| 最近记录: |