我想了解線程是如何工作的,我寫了一個簡單的例子,我想創建並啓動一個新線程,線程,在主線程中顯示從1到1000的數字,恢復輔助線程,並在輔助線程中顯示從1到1000的數字。當我忽略Thread.wait()/ Thread.notify()它的行爲如預期時,兩個線程一次顯示幾個數字。當我添加這些函數時,出於某種原因,主線程的數字將被打印第二個而不是第一個。我究竟做錯了什麼?獲取一個線程暫停 - Thread.wait()/ Thread.notify()
public class Main {
public class ExampleThread extends Thread {
public ExampleThread() {
System.out.println("ExampleThread's name is: " + this.getName());
}
@Override
public void run() {
for(int i = 1; i < 1000; i++) {
System.out.println(Thread.currentThread().getName());
System.out.println(i);
}
}
}
public static void main(String[] args) {
new Main().go();
}
public void go() {
Thread t = new ExampleThread();
t.start();
synchronized(t) {
try {
t.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
for(int i = 1; i < 1000; i++) {
System.out.println(Thread.currentThread().getName());
System.out.println(i);
}
synchronized(t) {
t.notify();
}
}
}
正如你所知,wait/notify被認爲已被棄用,你應該學習java.util.concurrent。 「Java併發實踐」是迄今爲止關於這個主題的最好的書。 – toto2
@ toto2等待/通知不被視爲棄用。併發包包含更高級別的併發結構,通常*可以簡化併發編程,因此對於大多數情況下使用這些更高級別的結構是可取的。 –