所以我有以下代碼:Java的synchronized塊,不是所有的線程就會被終止
import java.lang.Thread;
import java.lang.Integer;
class MyThread extends Thread {
private int id;
MyThread(int i){
id = i;
}
public void run() {
while(true){
try{
synchronized(Global.lock){
Global.lock.wait();
if(Global.n == 0) {System.out.println(id); Global.lock.notify(); break;}
--Global.n;
System.out.println("I am thread " + id + "\tn is now " + Global.n);
Global.lock.notify();
}
}
catch(Exception e){break;}
}
}
}
class Global{
public static int n;
public static Object lock = new Object();
}
public class Sync2{
public static final void main(String[] sArgs){
int threadNum = Integer.parseInt(sArgs[0]);
Global.n = Integer.parseInt(sArgs[1]);
MyThread[] threads = new MyThread[threadNum];
for(int i = 0; i < threadNum; ++i){
threads[i] = new MyThread(i);
threads[i].start();
}
synchronized(Global.lock){Global.lock.notify();}
}
}
兩個參數被輸入:一些n
以及要創建的線程數。每個線程都會減少n,然後傳遞控制權。當n爲0時,所有線程都應該停止。它似乎迄今爲止工作正常,但唯一的問題是,在大多數情況下,除一個線程外的所有線程都會終止。還有一個掛着。任何想法爲什麼?
是的,這是作業的一部分,這是我迄今爲止所做的(我沒有提供代碼)。我也明確限制使用一個同步塊,只有wait()
和.notify()
方法由任務完成。
編輯:改性同步塊一個比特:
synchronized(Global.lock){
Global.lock.notify();
if (Global.n == 0) {break;}
if (Global.next != id) {Global.lock.wait(); continue;}
--Global.n;
System.out.println("I am thread " + id + "\tn is now " + Global.n);
Global.next = ++Global.next % Global.threadNum;
}
現在線程在它們被創建的順序嚴格行事。從任務的措辭來看,它很不清楚,但可能是正確的。
你的鎖對象應該是`final`。 – Paul 2011-12-14 05:51:23
你是否必須使用`wait`和`notify`或者他們是否可選?如果你所要做的只是減少n,你可以用`synchronized`來完成。 – Paul 2011-12-14 06:47:51
是的,我明白了。對我來說,就像我實際上必須...仍然不能找出一種方法,使其爲單個工作人員工作。其實沒有人通知... – 2011-12-14 06:59:29