手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>Java技术>列表

Java Thread Programming 1.8.2 - Inter-thread Communication

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
Missed Notification
A missed notification occurs when threadB tries to notify threadA, but threadA is not yet waiting for the notification. In a multithreaded environment like Java, you don’t have much control over which thread runs and for how long. This uncertainty can lead to a situation in which most of the time an application is run, threadA is waiting before threadB does the notification. But occasionally, threadB does the notification before threadA is waiting. This missed notification scenario can be quite dangerous.
Missed Notification指:线程B试图通知线程A,但线程A并没有在等待通知。这并不是不可能出现的。在多线程环境中,我们不能控制哪个线程执行,执行多长时间,这种不确定有可能导致在一个线程等待之前就先行通知,这是一种很危险的情况。如下程序会出现这种情况:
/*
* Created on 2005-7-14
*
* Java Thread Programming - Paul Hyde
* Copyright ? 1999 Sams Publishing
* Jonathan Q. Bo 学习笔记
*
*/
package org.tju.msnrl.jonathan.thread.chapter8;
/**
* @author Jonathan Q. Bo from TJU MSNRL
*
* Email:jonathan.q.bo@gmail.com
* Blog:blog.csdn.net/jonathan_q_bo
* blog.yesky.net/jonathanundersun
*
* Enjoy Life with Sun!
*
*/
public class MissedNotify {
private Object proceedLock;
public MissedNotify(){
proceedLock = new Object();
}
public void waitProceed() throws InterruptedException{
print("in waitProceed() - begin");
synchronized(proceedLock){
print("begin synchronized wait ...");
proceedLock.wait();
print("end synchronized wait ...");
}
print("in waitProceed() - end");
}
public void notifyProceed(){
print("in notifyProceed() - begin");
synchronized(proceedLock){
print("begin synchronized notify ...");
proceedLock.notifyAll();
print("end synchronized notify ...");
}
print("in notifyProceed() - end");
}
public static void print(String msg){
String temp = Thread.currentThread().getName();
System.out.println(temp " - " msg);
}
public static void main(String[] args) {
final MissedNotify mn = new MissedNotify();
Runnable runA = new Runnable(){
public void run(){
try{
Thread.sleep(1000);//wait()后执行
mn.waitProceed();
}catch(InterruptedException e){
e.printStackTrace();
}
}
};
Thread threadA= new Thread(runA,"threadA");
threadA.start();
Runnable runB = new Runnable(){
public void run(){
try{
Thread.sleep(500);//notify()先执行
mn.notifyProceed();
}catch(InterruptedException e){
e.printStackTrace();
}
}
};
Thread threadB = new Thread(runB,"threadB");
threadB.start();
try{
Thread.sleep(10000);
}catch(InterruptedException e){
}
print("interrupt thread A ...");
threadA.interrupt();
}
}
输出结果:
threadB - in notifyProceed() - begin
threadB - begin synchronized notify ...
threadB - end synchronized notify ...
threadB - in notifyProceed() - end
threadA - in waitProceed() - begin
threadA - begin synchronized wait ...

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!