q.利用主程式呼叫多執行緒時, 要怎麼停止正在執行的多執行緒
ans. 在thread裡利用InterruptedException 把工作結束
例如這裡是for loop 10次, 就把工作數直接設定到滿
建立Car
每一台車工作量10次
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | 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 ; } } } } |
主程式
1 2 3 4 5 6 7 8 9 10 11 12 | 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也是讓該執行緒結束, 所以主程式還是視此子執行緒成功結束了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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的所有執行緒
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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
1 2 3 4 5 6 7 8 9 | 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(); } } |