2012-05-02 17 views
6

我是Java新手,使用某人給出的代碼。在那裏,在代碼的最後,如果它還沒有完成,它們會中斷一個線程。我正在測量代碼的時間。java:正在中斷絕對必要的線程

問題是Java代碼首先發出所有線程,然後在最後中斷。打斷是必要的嗎?我們不能等到所有線程真的完成了嗎?或者可能只是跳過中斷(這些線程正在使用process exec命令運行進程,並且它們將完成)。 這裏是相關的代碼。首先各個線程的代碼:

String commandString = "./script.scr "; 
    process = Runtime.getRuntime().exec(commandString); 
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    while ((lsString = bufferedReader.readLine()) != null) 
     { 
      System.out.println(lsString); 
     }  
     try 
     { 
      process.waitFor(); 
     } 

現在一部分的該調度這些線程的代碼:

public void stopWhenAllTaskFinished() 
{ 
    while(notFinished) {sleep(50);} //notFinished is class variable and somewhere else it will set to false. 
    //now finished. 
    //Interrupt all the threads 
    for (int i=0; i<nThreads; i++) { 
     threads[i].interrupt(); 
    } 
} 

此功能從主類喜歡叫:

obj.stopWhenAllTaskFinished() 

我很大感謝任何見解或答案。

+5

很遺憾,您的描述過於模糊。中斷可能需要也可能不需要。這一切都取決於'線程'的作用。 – Frankie

+0

我已經添加了相關的代碼 – user984260

+1

老實說,它看起來像一個偏執的檢查從未發生過的事情。 – trutheality

回答

1

目前尚不清楚是否從已發佈的代碼所需要的中斷。

  • 如果notFinished設置爲false當所有線程都完成了,那麼中斷是不必要的。

  • 如果notFinished設置爲false時,有一種可能性,即一些線程還沒有完成,那麼它可能是必要的。實際上是否有必要取決於其他事情:

    • 您是否準備好讓應用程序等待線程自然完成?
    • 你能確定線程完成? (他們可以永遠掛住/阻止嗎?)
    • 你需要他們的活動結果嗎?
    • 他們會迴應中斷嗎? (在這種情況下,我認爲答案是「是」)。
    • 離開線程有什麼危害嗎? (例如,它停止的應用程序關閉?)
+0

1.是的,我準備好了。是的,他們肯定會結束。 3.不,我只是整個應用程序的時間(在線程上完成的每個任務都需要一些時間,但是如果中斷:它不好)。 4.是5.我不知道是否有傷害。我唯一的要求是:沒有線程應該在完成和整體應用程序之前被殺死。應該只在所有線程完成時結束。 – user984260

+0

「如果在所有線程結束時notFinished被設置爲false。」我想,情況並非如此。在所有線程完成之前未完成修改 – user984260

+1

答案3意味着中斷實際上可能是有害的。 –

2

Oracle在javadoc中提供的以下代碼是大多數人所做的。 AFAIK,這是設計用來殺死線程,讓他們有機會關閉後拒絕正常關閉。

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ExecutorService.html

void shutdownAndAwaitTermination(ExecutorService pool) { 
    pool.shutdown(); // Disable new tasks from being submitted 
    try { 
    // Wait a while for existing tasks to terminate 
    if (!pool.awaitTermination(60, TimeUnit.SECONDS)) { 
     pool.shutdownNow(); // Cancel currently executing tasks 
     // Wait a while for tasks to respond to being cancelled 
     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) 
      System.err.println("Pool did not terminate"); 
    } 
    } catch (InterruptedException ie) { 
    // (Re-)Cancel if current thread also interrupted 
    pool.shutdownNow(); 
    // Preserve interrupt status 
    Thread.currentThread().interrupt(); 
    } 
} 
+1

這是針對線程池的 - 原始問題不使用線程池 –

+0

是的,代碼使用:private PoolWorker []線程,請問您可以告訴合適的代碼(或給一個重新ference)。 – user984260

+0

對不起,我發佈之前,他發佈任何代碼。我會研究這個新問題。 – Jon7