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

时间:2013-11-28 09:59:52

标签: java multithreading

我有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

4 个答案:

答案 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。如果你不在乎打印数字的顺序。