public class NotifyTest { /** * @param args */
public static Object lock;
public NotifyTest(){
NotifyTest.lock = new Object();
}
public static void main(String[] args) { // TODO Auto-generated method stub
NotifyTest testNotify = new NotifyTest(); ThreadB b = testNotify.new ThreadB(); b.start(); System.out.println("b is start");
synchronized(NotifyTest.lock){ try{
NotifyTest.lock.wait(); // 暂时放弃对象锁,让主线程暂停,让ThreadB开始执行
System.out.println("Waiting for b to complete");
System.out.println("testPoint");
} catch(Exception e){ e.printStackTrace(); } System.out.println("Final Total is:"+b.total); } } class ThreadB extends Thread{
int total; public void run() { synchronized(NotifyTest.lock) { System.out.println("ThreadB is running"); for(int i=0;i<100;i++) { total+=i; }
System.out.println("testPoint1");
NotifyTest.lock.notify(); // 执行完毕,唤醒被暂停的线程 } } }}
public static Object lock;
public NotifyTest(){
NotifyTest.lock = new Object();
}
public static void main(String[] args) { // TODO Auto-generated method stub
NotifyTest testNotify = new NotifyTest(); ThreadB b = testNotify.new ThreadB(); b.start(); System.out.println("b is start");
synchronized(NotifyTest.lock){ try{
NotifyTest.lock.wait(); // 暂时放弃对象锁,让主线程暂停,让ThreadB开始执行
System.out.println("Waiting for b to complete");
System.out.println("testPoint");
} catch(Exception e){ e.printStackTrace(); } System.out.println("Final Total is:"+b.total); } } class ThreadB extends Thread{
int total; public void run() { synchronized(NotifyTest.lock) { System.out.println("ThreadB is running"); for(int i=0;i<100;i++) { total+=i; }
System.out.println("testPoint1");
NotifyTest.lock.notify(); // 执行完毕,唤醒被暂停的线程 } } }}
解决方案 »
- 对于parseInt(String )的NumberFormatException如何进行更细的捕获
- 请指教:持有对方引用
- java udp连接
- 紧急求助:怎样让socket的一个线程实现连续读写
- 大家好,关于虚拟机内存的问题!请帮助
- 关于jre配置问题
- 在Java中如何统计一个字符串中所有字符出现的次数
- 看看我對class method 和 instance method 的理解,及implicit argument&explicit argument.
- 我是一个从没用过JAVA的菜鸟,想问一下各位JAVA有没有下面的功能。(见内容)
- java JSpinner微调控件限定输入格式问题
- 为什么getKeyCode()返回的总是0
- 谁能告诉我classpath的作用
可以在ThreadB的run方法前面加上:try {
Thread.sleep(1000);
} catch (InterruptedException e) {}试试
原因分析:线程执行很快,在第一个同步块被建立的之前,线程b可能已经执行完毕,主类的同步块就可能永远等待
修改办法:将线程b的启动部分移入第一个同步块修改后的源代码:
public class NotifyTest { /** * @param args */
public static Object lock;
public NotifyTest(){
NotifyTest.lock = new Object();
}
public static void main(String[] args) { // TODO Auto-generated method stub
NotifyTest notifyTest = new NotifyTest();
ThreadB b = notifyTest .new ThreadB();
System.out.println("b is start");
synchronized(NotifyTest.lock){
b.start();
try{
NotifyTest.lock.wait(); // 暂时放弃对象锁,让主线程暂停,让ThreadB开始执行
}
catch(Exception e){
e.printStackTrace();
}
System.out.println("Waiting for b to complete");
System.out.println("testPoint");
System.out.println("Final Total is:"+ b.total);
}
}
class ThreadB extends Thread{
int total = 0; public void run(){ synchronized(NotifyTest.lock){
try{
System.out.println("ThreadB is running");
for(int i=0;i<100;i++){
total+=i;
}
System.out.println("testPoint1");
NotifyTest.lock.notify(); // 执行完毕,唤醒被暂停的线程
}
catch(Exception e){
e.printStackTrace();
}
}
}
}
}