q.利用主程式呼叫多執行緒時, 要怎麼停止正在執行的多執行緒
ans. 在thread裡利用InterruptedException 把工作結束
例如這裡是for loop 10次, 就把工作數直接設定到滿
建立Car
每一台車工作量10次
public class Car implements Runnable {
private String name;
public Car(String name) {
this.name = name;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(name + " move :" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
System.out.println(name + " is interrupted.");
i = 10;
}
}
}
}
主程式
Car toyota = new Car("toyota");
Car ford = new Car("ford");
Thread thread1 = new Thread(toyota);
Thread thread2 = new Thread(ford);
thread1.start();
thread2.start();
Thread.sleep(2000);
thread2.interrupt();
System.out.println("main job is done");
thread1, thread2 啟動後, 等待兩秒,
再呼叫thread2.interrupt() , 這樣執行緒收到interrupt, 就會以interrupted exception 處理, 終止工作
而另一支thread1 繼續進行
如果我想等所有的執行緒都結束, 再回到主程式, 則加上join()即可
因為interrupted exception也是讓該執行緒結束, 所以主程式還是視此子執行緒成功結束了
Car toyota = new Car("toyota");
Car ford = new Car("ford");
Thread thread1 = new Thread(toyota);
Thread thread2 = new Thread(ford);
thread1.start();
thread2.start();
Thread.sleep(2000);
thread2.interrupt();
thread2.join();
thread1.join();
System.out.println("main job is done");
如上
ford會在兩秒後中斷, 但主程式會繼續等待toyota跑完全部工作, 主程式再結束
ThreadGroup
如果我是想從另外一支程式停止特定的thread,則可以利用threadgroup
再取得符合threadgroup name的所有執行緒
Car toyota = new Car("toyota");
Car ford = new Car("ford");
ThreadGroup tg = new ThreadGroup("CarGroup");
Thread thread1 = new Thread(tg,toyota);
Thread thread2 = new Thread(tg,ford);
logger.info(tg.getName());
thread1.start();
thread2.start();
thread2.join();
thread1.join();
logger.info("main job is done");
request stop
Map<Thread, StackTraceElement[]> threads = Thread.getAllStackTraces();
for (Map.Entry<Thread, StackTraceElement[]> entry : threads.entrySet()) {
Thread thread = entry.getKey();
ThreadGroup threadGroup = thread.getThreadGroup();
if (threadGroup.getName().equals("CarGroup")) {
threadGroup.interrupt();
}
}
