我剛開始使用線程。我寫的建立和啓動100個線程,一個主類等待5秒鐘,然後中斷他們(至少這是我認爲它所做的那樣):如何(可靠地)中斷線程在Java中的特定時間之後形成主線程?
public static void main(String[] args) {
List<Thread> threads = new ArrayList<Thread>();
for (int i = 0; i < 100; i++) {
Thread t = new Thread(new Walker());
threads.add(t);
}
System.out.println("Starting threads...");
for (Thread thread : threads) {
thread.start();
}
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// don't do anything
}
System.out.println("Time's up - Terminating threads...");
for (Thread t : threads) {
t.interrupt();
System.out.print(".");
}
for (Thread t : threads) {
try {
t.join(10);
} catch (InterruptedException e) {
// don't do anything
}
}
System.out.println("");
System.out.println("All done.");
}
螺紋看上去有點像這樣:
public class Walker implements Runnable {
public void run() {
for (int i = 0;; i++) {
//do some complicated stuff that takes some time
System.out.println(Thread.currentThread().getName() + ":" + i);
if (Thread.interrupted()) {
break;
}
}
}
}
現在,我得到的輸出是主線程開始中斷線程,但是一些子線程在終止之前繼續運行幾次(即循環迭代),例如
啓動線程...
線程1:0
線程2:0
線程1:1
線程3:0
[...]
時間到了 - 終止線程...
......線程1:60
線程1:61
...螺紋-1:62
線程2:55
..所有完成。
[從線程輸出有時甚至繼續在這裏 - 聯接()之後 - 我的預期
當時我沒有完全明白,一個線程可以分配足夠的處理器時間來運行幾次在主線程有機會中斷它之前至多再運行一次。
不過,雖然我現在看,這是絕對的罰款吧,我還是想知道一些(長)時間的主線程都有機會結束前(即中斷)要執行的線程:有一個容易方式從主線程及時中斷所有子線程? (通過線程的構造函數設置「生存時間」,然後在Walker類中進行測試,這不是我想要的。)
另請參見:是否有可能執行最後一個print語句,然後查看一些輸出個人線程 - 畢竟線程被加入()編輯? (也許我有毛刺其它地方;實際的代碼更復雜一點......)
謝謝你,我會在一個去。 :) – Christian