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();
认为共享对象 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();