我有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
答案 0 :(得分:0)
线程之间没有真正的同步。每个都使用不同的锁(即它自己的&#34;奇数&#34;成员的副本)。
此外,在您的实现中,没有什么能阻止第二个线程打印所有偶数并快速完成其循环。它永远不会等待#1号线。
答案 1 :(得分:0)
不要将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();
主要代码:
{{1}}
答案 2 :(得分:0)
您需要锁定同一个对象。或者制作你的锁定对象static
(这不好,顺便说一句)。可能所有同步逻辑都应该在您的main
方法上完成,并从Print类中排除。
答案 3 :(得分:0)
如果按照您的代码顺序执行某些操作,那么它就不是线程的候选者。线程只有在可以并行完成某些事情时才有用,所以在你的情况下,i.E。如果你不在乎打印数字的顺序。