[英]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.