2012-10-18 71 views
1

這個問題是導致它的幾個問題的頂點。我只是想確保在我做出任何更改之前,我擁有了一切。添加線程中斷執行run()

因此,這裏就是我的工作對數據結構:

在一個抽象類:

public abstract void doRun(); 

public void run(){ 
    try{ 
    while(!Thread.currentThread().isInterrupted() || hasRunBefore){ 
     doRun(); 
    } 
    }catch (InterruptedException e){Thread.sleep(1); System.out.println("Thread Interrupted: "); e.printStackTrace(); } 

} 

然後在子類中正在實施我的抽象類:

public void doRun(){ 
    doChildClassStuff(); 
} 

然後,當我在我的主類中調用這些時,我只需做

ClassName myClass = new ClassName(constructor.list); 
ExecutorService threadPool = Executors.newFixedThreadPool(12); 
    List<Future<?>> taskList = new ArrayList<Future<?>>(); 
    taskList.add(myClass); 
    for(Future future : taskList){ 
     try{ 
      future.get(1, TimeUnit.SECONDS); 
     }catch(CancellationException cx){ System.err.println("Cancellation Exception: "); cx.printStackTrace(); 
     }catch(ExecutionException ex){ System.err.println("Execution Exception: ");ex.printStackTrace(); 
     }catch(InterruptedException ix){ System.err.println("Interrupted Exception: ");ix.printStackTrace(); 
     }catch(TimeoutException ex) {future.cancel(true);} 
    } 
    threadPool.shutdown(); 
    threadPool.awaitTermination(60, TimeUnit.SECONDS); 
    threadPool.shutdownNow(); 

如果thread.sleep()失敗,則表示該線程已被中斷並應退出。如果所有的線程超過60秒,那麼他們都會從awaitTermination發送thread.interrupt()命令,對吧?

我完全脫離了這裏嗎?

回答

1

看起來你正試圖處理基類中的線程中斷。不幸的是,基類沒有辦法「偵聽」線程中斷。您的doChildClassStuff()需要處理Thread.currentThread().isInterrupted()檢查本身。它需要能夠檢測線程是否被中斷,以便它可以返回或拋出InterruptedException

你不需要Thread.sleep(1);。如果線程已被中斷,它將拋出InterruptedException,但您可以輕鬆地使用Thread.currentThread().isInterrupted()進行測試。由於您已經在InterruptedException的catch塊中,所以我不確定它是什麼點。此外,您的doRun()不會丟棄InterruptedException,以便代碼示例(按其原樣)將不會編譯。

+0

是否真的沒有辦法讓我可以實現一個監聽器的父?有大約50班,我將不得不手工修改,這將意味着提交的TON –

+0

不幸的是,沒有@ Damien.Bell。基類沒有辦法「偵聽」線程中斷。 – Gray

+0

廢話,好吧......這也在我的子類中提出了另一個問題,它們不是循環運行的,它們本質上是簡單的語句,每個語句都執行一些可運行的方法。 –