在看以前的代码,发现做基础测试时的一些疑问。
public class Test10 {
public static void main(String[] args){
String name1,name2;
name1="Mother";
name2="Son";
Cooking ck=new Cooking(name1,name2);
Thread T1=new Thread(ck);
Thread T2=new Thread(ck);
T1.setName(name1);
T2.setName(name2);
T1.start();
T2.start();
}
}
class Cooking implements Runnable{
private boolean hasSalt;
Object lock=new Object();
private boolean isfinished;
String name1,name2;
Cooking(String s1,String s2)
{name1=s1;name2=s2;}
public void run(){
if((Thread.currentThread().getName()).equals(name1)){
while(!isfinished){
if(!hasSalt){
System.out.println("没盐了,先等儿子把盐买回来再做饭");
synchronized(lock){
try{System.out.println("等待中");lock.wait();}catch(InterruptedException e){}}
}
System.out.println("有盐了,开始做饭吧");
}}
if((Thread.currentThread().getName()).equals(name2)){
synchronized(lock){
System.out.println("没盐了,先去买盐吧······");
try{Thread.sleep(18);}catch(InterruptedException ie){}
System.out.println("盐买好了");hasSalt=true;
lock.notify();
}
}
}
}
运行结果的话····很2,竟然还会有线程不安全的问题,儿子把盐买好了妈妈还是在等待,而且有部份代码,至此关于同步代码块我彻底晕了·····当然同步方法也挺晕的,上面这代码虽然妈妈和儿子开口的顺序是控制不好这点我也看出来了,不过我最不解的是为啥System.out.println("有盐了,开始做饭吧");这代码从来都没被执行过,是不是说因为我建立了两个线程,他们分别执行了上面的if代码块和下面的if代码块,然后下面的if代码块跟上面的就一点关系都没有了呢·可我用的是实现Runnable接口来建立线程的啊,传入的是同一对象那lock就该是同一个lock,为啥·那唤醒语句唤醒以后我上面的代码块好像一点反应也没有··就算我把语句放在try块内wati()方法的后面,或者放catch{}块内都没用,话说要是被唤醒了catch块不是会捕捉到异常吗,为啥一点反应都没有啊
|
|