----------------解决方案--------------------------------------------------------
谁看了今天CCTV10的电视了,茅以升真的好伟大
看来楼主对wait和notify的了解还不是很清楚。帮你看看吧
----------------解决方案--------------------------------------------------------
谢谢神!!
我对线程不熟!
----------------解决方案--------------------------------------------------------
/**
*
* @author vlinux
*/
public class ThreadTest {
Thread1 live41=new Thread1();
Thread2 knocker=new Thread2();
private int m=0;
public ThreadTest() {
live41.setName("live41");
knocker.setName("knocker");
live41.start();
knocker.start();
}
public static void main(String[] args) {
ThreadTest t=new ThreadTest();
}
/**
* live41
*/
class Thread1 extends Thread {
public void run() {
System.out.println( "["+this.getName()+"]:\t我在等"+knocker.getName()+"那白痴." );
synchronized( knocker ) {
try {
knocker.wait(); //等knocker那头猪
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
//live41的责任是就数数字
System.out.println("["+this.getName()+"]:\t我靠!"+knocker.getName()+"那白痴终于干完了,轮到我了.");
System.out.print("["+this.getName()+"]:\t");
for( int i=0; i<10; i++ ) {
System.out.print( i+" " );
}
System.out.println(this.getName()+"的工作完成");
}
}
/**
* knocker
*/
class Thread2 extends Thread {
public void run() {
System.out.println( "["+this.getName()+"]:\t我10秒后开始运行." );
try {
Thread.sleep(1000*10); //等待10秒....恶~
} catch (InterruptedException ex) {
ex.printStackTrace();
}
//knocker的工作就是念字母
System.out.print("["+this.getName()+"]:\t");
for( int i='a'; i<='z'; i++ ) {
System.out.print( (char)i+" " );
}
System.out.println(this.getName()+"的工作完成");
synchronized( this ) {
notify(); //通知live41,工作完成,开始干活
}
}
}
}
----------------解决方案--------------------------------------------------------
总结:你想等谁,那你就必须得有谁的锁。
比如:
synchronized( knocker ) {
try {
knocker.wait(); //等knocker那头猪
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
live41要等knocker念完字母后才能数他的数字,那么live41就必须得有knocker这个对象的锁。
synchronized( knocker ) {
// code go here
}
但是,解除等待的时候正好相反,knocker要通知live41开始工作,则必须要有自己的锁,根据这个锁来告诉live41:“你可以数数字了”。
synchronized( this ) {
notify(); //通知live41,工作完成,开始干活
}
----------------解决方案--------------------------------------------------------
不错很形象,我想加精
----------------解决方案--------------------------------------------------------
神的程序写得好
----------------解决方案--------------------------------------------------------
,非常感谢!
只是最后的地方,notify();方法怎么知道是通知的另外一个呢,如果是多个等待是否就要用notifyAll()呢!
----------------解决方案--------------------------------------------------------
你只要调用了一个对象的notify方法,JVM就会去通知等待获这个对象上锁的线程,让它醒过来,如果多个线程都在等待这个对象的锁,那么你可以调用notifyAll方法
----------------解决方案--------------------------------------------------------
基本明白了!
平时说的多线程来实现一个任务,是不是就是把任务分割,让每个线程实现一部分?
----------------解决方案--------------------------------------------------------