Java 线程同步 101

Java Thread Synchronization 101

认为共享对象 Control 会强制 n 线程 (Number) 按顺序显示,但他们显然不会:

人数:

public class Number implements Runnable {

    private int i_;
    private Control control;

    public Number(int i, Control c) {
        i_ = i;
        control = c;
    }

    public void start() {
        new Thread(this).start();
    }

    public void run() {
        synchronized(control) {
            control.call(i_);
        }
    }
}

控制:

public class Control {

    private int i_ = 0;

    public void call(int i) {

        if(i != i_) {
            try {
                wait();
            }
            catch(Exception e) {}
        }

        System.out.println(i);
        i_++; // next, please                                                                                                                                                                                   
        notify();
    }
}

测试工具(主要):

public class RunNumbers {

    public static void main(String args[]) {

        int n = 0;
        if (args.length > 0) {
            n = Integer.parseInt(args[0]);
        }

        Control c = new Control();
        for(int i = 0; i < n; ++i) {
            new Number(i, c).start();
        }
    }
}

有什么想法吗?

以上内容是通过将几个仅涉及一对线程的教程拼凑在一起的(没有真正知道发生了什么)---导致无法将所有内容扩展到两个以上的线程。

经过更多研究,可以通过更改 Control.java 中的 2 行来解决上述问题:

(a) 将 if(i != i_) { 更改为 while(i != i_) {

(b) 将 notify(); 更改为 notifyAll();