2011-09-29 179 views
2

如何在運行5秒後停止運行的線程?在一段時間後停止線程

我無法使用java 5 +線程功能(必須在j2me中工作)。


可能的解決方法 -

安排兩個線程。一個執行實際工作(T1),另一個執行T1(T2)監視。

一旦T1開始,然後開始T2。 T2每秒在T1上調用isalive()方法,如果在10秒後T2還沒有死,那麼T2會在T1上調用終止,這會終止T1線程。

這是可行的嗎?

Timer timer = new Timer(); 

TimerTask timerTask = new TimerTask() { 

public void run() { 
     getPostData(); 
    } 
}; 

timer.schedule(timerTask, 0); 

public void abortNow() { 
    try { 
     _httpConnection.close(); 
    } 
    catch(Exception e){ 
     e.printStackTrace(); 
    } 
} 
+0

我無法使用class executorservice,因爲這必須與j2me一起工作 –

回答

1

對於您的問題沒有獨特的答案。這取決於線程的功能。首先,你打算如何阻止該線程?

  1. 如果它闡述了一些東西,這些東西是由「令牌」,如單一的「任務」做的,線程從BlockingQueue例如抓住它,然後你可以用這樣停止線程被稱爲「毒丸」,就像一個模擬的任務,線程讀作:「嘿,我必須關閉」。
  2. 如果線程做了一些不能被「分成」「步驟」的東西,那麼你應該告訴我們你怎麼認爲它可以關閉。如果它在套接字上的read()上阻塞,則只能關閉套接字以解除封鎖。

請注意interrupt()並不意味着在正常情況下停止Thread,如果你interrupt()一個線程,在大多數情況下,它只會繼續做它的東西。在99.9%的情況下,使用interrupt()阻止線程的設計就是糟糕的設計。

無論如何,5秒後停止它,只需設置一個Timer這樣做。或者更好的是,它有5秒的超時時間,在此之後,停止它。問題是如何阻止它。所以請告訴我你認爲該線程應該停止,以便我可以更好地幫助你。

告訴我線程的功能。

編輯:在回答你的評論,只是一個例子

class MyHTTPTransaction extends Thread { 
    public MyHTTPTransaction(.....) { 
     /* ... */ 
    } 
    public void run() { 
     /* do the stuff with the connection */ 
    } 
    public void abortNow() { 
     /* roughly close the connection ignoring exceptions */ 
    } 
} 

然後

MyHTTPTransaction thread = new MyHTTPTransaction(.....); 
thread.start(); 
thread.join(5000); 
/* check if the thread has completed or is still hanging. If it's hanging: */ 
    thread.abortNow(); 
/* else tell the user everything went fine */ 

:)

您還可以設置一個Timer,或Lock的使用Condition因爲我敢打賭可能會有一些競爭條件。

乾杯。

+1

線程發送一個運行一次的http文章。問題取決於網絡連接,這篇文章可能需要2到10秒的時間。如果超過5秒鐘,我應該停下來。所以我不知道我可以如何阻止線程運行。也許我可以在http帖子上設置超時時間。 –

+1

是的,在這種情況下,您應該嘗試在HTTP帖子中設置超時。但是,如果例如上傳速度爲1字節/秒,我認爲沒有超時。超時是針對連接握手和不活動的,「慢速活動」正在進行。所以你可以設置一個'Timer',它在5秒後殘酷地關閉連接,導致你的線程停止作爲副作用。 – gd1

+0

如何以這種方式使用Timer?你的意思是在一段時間後使用定時器的取消方法? –

相關問題