将两个线程同步打印到stderr

时间:2016-11-18 08:43:40

标签: java multithreading

据我所知,使用java synchronize和notify()以及wait()方法同步两个线程的方式如下:

public class Tester {
    public static void main(String[] args) throws InterruptedException {
        final Business business = new Business();
        // 子线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 50; i++) {
                    try {
                        business.sonBusiness(i);
                    } catch (InterruptedException e) {
                    }
                }
            }
        }).start();
        for (int i = 0; i < 50; i++) {
            business.mainBusiness(i);
        }
    }
}
class Business {
    public void mainBusiness(int i) throws InterruptedException {
        synchronized (this) {
            for (int j = 1; j <= 20; j++) {
                System.out.println("主线程第" + i + "轮,第" + j + "次");
            }
            this.notify();
            this.wait();
        }
    }
    public void sonBusiness(int i) throws InterruptedException {
        synchronized (this) {
            for (int j = 1; j <= 30; j++) {
                System.err.println("子线程第" + i + "轮,第" + j + "次");
            }
            this.notify();
            this.wait();
        }
    }
}

然而,我看到的输出(见下文)告诉我,同步不符合我的预期。我认为主线程和新线程可以一个接一个地运行&#34;在大多数情况下他们这样做。但我得到以下输出。我不知道如何解释,请帮我一把。

enter image description here

1 个答案:

答案 0 :(得分:3)

我想这是因为您要同时将它们打印到System.errpublic class ObjectType { ObjectType1 ob1; ObjectType2 ob2; // setters and getters } 。在IDE中,它们可能是同一个控制台,但不能很好地同步。