繁体   English   中英

等待并通知2个并行运行的线程

[英]Wait and notify for 2 parallel running threads

我有2个线程t1和t2,它们将打印1到10。t1线程将打印奇数,而t2线程将打印偶数。 我很困惑,我怎么知道这个线程是t1或t2,并且应该按顺序执行1到10的打印。 我最终做到了。 请指出我要去哪里了。

class Print implements Runnable{

Object odd = new Object();

public void run() {
    for (int i = 1; i <= 10; i ++){

        if(Thread.currentThread().getName().equals("t1")){
            synchronized(odd){
                    if ((i %2 !=0))
                    System.out.println(i + " Thread - " + Thread.currentThread().getName());

                try {
                    odd.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }

        if(Thread.currentThread().getName().equals("t2")){  
        synchronized(odd){
                    if ((i %2 ==0)){
                    System.out.println(i + " Thread - " + Thread.currentThread().getName());
                    odd.notifyAll();
                }   
            }
        }

    }

}

}

public class EvenOdd {

    public static void main(String[] args) {

            Print obj1 = new Print();
            Print obj2 = new Print();

            Thread t1 = new Thread(obj1, "t1");
            Thread t2 = new Thread(obj2, "t2");
            t1.start();
            t2.start();

        }

    }

输出:

1线程-t1 2线程-t2 4线程-t2 6线程-t2 8线程-t2 10线程-t2

线程之间没有真正的同步。 每个使用不同的锁(即它是“奇数”成员的自己的副本)。

另外,在您的实现中,没有什么可以阻止第二个线程打印所有偶数并快速完成其循环的。 它从不等待线程#1。

不要新Print两个不会共享您的odd
我更改了您的代码,它按您的预期工作:

    class Print implements Runnable{
       Object odd = new Object();

       public void run() {
        for(int i=1;i<=10;i++){
         if(Thread.currentThread().getName().equals("t1")){
           synchronized(odd){
             if(i%2==0) 
               continue;
             System.out.println(i + " Thread - " + Thread.currentThread().getName());
             odd.notifyAll();
             odd.wait();
           }
         }else{
            synchronized(odd){
             if(i%2!=0) 
               continue;
             System.out.println(i + " Thread - " + Thread.currentThread().getName());
             odd.notifyAll();
             odd.wait();
           }
         }
        }
      }
    }

主要代码:

    Print obj1 = new Print()
    Thread t1 = new Thread(obj1, "t1")
    Thread t2 = new Thread(obj1, "t2")
    t1.start();
    Thread.sleep(10) //let t1 run first
    t2.start();

您需要锁定同一对象。 或者将您的锁定对象static (不好,顺便说一句)。 可能所有同步逻辑都应在您的main方法上完成,并从Print类中排除。

如果您像在代码中那样按顺序执行某项操作,则它不适合线程化。 线程仅在可以并行完成某些操作时才有帮助,因此,如果您不关心数字的打印顺序,则就您而言。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM