welen 2014-03-06 01:06
浏览 1086

一个多线程分别打印abc的问题

运行这段代码,前面可以打印两三次abc,然后就卡住了,初步估计应该都进入wait了,但是不明白为什么,求指导`public class TestDemo {

public static void main(String[] args) {
    final Locker p = new Locker();
    Task11 a = new Task11(p);
    Task21 b = new Task21(p);
    Task31 c = new Task31(p);
    Thread one = new Thread(a);
    one.start();
    Thread two = new Thread(b);
    two.start();
    Thread three = new Thread(c);
    three.start();
}

}

class Task11 implements Runnable {

private Locker obj;
public Task11(Locker p){
    this.obj = p;
}

@Override
public void run() {
    for(int i = 0; i < 5; i++){
        synchronized (obj) {
            if(obj.num != 0){
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }else{
                System.out.println("a");
                obj.num = 1;
                obj.notifyAll();
            }
        }
    }
}

}
class Task21 implements Runnable {

private Locker obj;
public Task21(Locker p){
    this.obj = p;
}

@Override
public void run() {
    for(int i = 0; i < 5; i++){
        synchronized (obj) {
            if(obj.num != 1){
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }else{
                System.out.println("b");
                obj.num = 2;
                obj.notifyAll();
            }
        }
    }
}

}
class Task31 implements Runnable {

private Locker obj;
public Task31(Locker p){
    this.obj = p;
}

@Override
public void run() {
    for(int i = 0; i < 5; i++){
        synchronized (obj) {
            if(obj.num != 2){
                try {
                    obj.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }else{
                System.out.println("c");
                obj.num = 0;
                obj.notifyAll();
            }
        }
    }
}

}

class Locker {
int num = 0;
}`

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥60 版本过低apk如何修改可以兼容新的安卓系统
    • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
    • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
    • ¥50 有数据,怎么用matlab求全要素生产率
    • ¥15 TI的insta-spin例程
    • ¥15 完成下列问题完成下列问题
    • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
    • ¥15 YoloV5 第三方库的版本对照问题
    • ¥15 请完成下列相关问题!
    • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?