2011-08-25 80 views
1

我想知道線程的每個下列實現之間有什麼區別,什麼時候應該使用每個選項。Java中的多線程編程 - 在方法上的差異?

1實現Runnable

public class ClientThread implements Runnable 
    { 
    new Thread(this).start(); 
    public void run() 
    {...} 
    } 

2-擴展Thread

class ServerThread extends Thread 
{ 
    this.start(); 
    public void run() 
    {...} 
} 

3-工作線程和SwingWorker這我真的不熟悉...

非常感謝你太多

  • 您好我已經添加了另一個問題,在下面這件事情,這是

好球員感謝所有的信息發佈作爲一個答案的原因 我誤刪除了我的餅乾的web瀏覽器感謝..。
但是,如果我想實現一個倒計時計時器,該計時器將在屏幕上與遊戲並行運行,而不會因爲在後臺顯示的一致定時器而阻塞遊戲流程並可能需要在事件調度線程上運行...

我可以嗎? e Runnable實現還是我必須使用swing工作?

+0

對於您的特定要求,您絕對應該使用SwingWorker,因爲這正是它的設計目的。您不能在事件派發線程上運行計時器,但必須僅在事件派發線程上更新UI。這是SwingWorker所做的非常協調。 –

+0

謝謝,但有人告訴我,我可以使用javax.swing.Timer類。這將以固定的時間間隔觸發動作事件,這將防止GUI無響應。那麼我可以在沒有SwingWorker的情況下解決這個問題嗎? – JavaSa

回答

3
  1. 這是首選方法,因爲它分隔提供代碼的線程應該運行(在Runnable實例的作業)和管理線程(Thread實例)的工作的關注,並且也允許有Runnable是其他東西的子類
  2. 不太乾淨,但也能正常工作
  3. 「工作線程」是與主應用程序並行運行的線程的概念名稱。 SwingWorker是一個旨在在Swing應用程序中實現工作者的類。它爲工作線程提供了一個API來將其狀態傳遞給Swing事件線程,以便它可以例如更新進度條。

請注意,手動使用線程通常非常困難。如果您出於性能原因需要多個線程,則通過Executors類來處理線程池會更好。

+0

+1 - Spot on,特別是指出Executor。你需要使用java.util.concurrent類來處理一個關卡。閱讀「實踐中的Java併發」。 – duffymo

1

"implements Runnable" vs. "extends Thread"非常接近重複,除了我真的不熟悉的第三點。我會推薦閱讀那篇文章,因爲它包含了很多非常好的信息。

  1. 當你只是想在一個單獨的線程運行它。 //正常情況下
  2. 擴展線程類函數或行爲時。
  3. 某些別有用心的人填寫:)

幾乎所有的時間,你應該使用#1,由於它的語義。您將它用作runnable,通常不會擴展線程類的功能。

1

關於併發性的官方Java課程涵蓋了這個話題。

Defining and Starting a Thread

你應該使用這些成語嗎?

使用Runnable對象的第一個習慣用法更一般,因爲Runnable對象可以繼承Thread以外的類。

第二個習慣用法在簡單的應用程序中更容易使用,但受到以下事實的限制:您的任務類必須是Thread的後代。

2

在一般情況下,它的首選實現Runnable接口,而不是延長線。這有幾個原因。首先,由於Java不支持多重繼承,有時擴展Thread不是一個選項。另外,從OOP的角度來看,實現Runnable通常更有意義;你不會爲Thread類添加功能,你正在創建一些要運行的東西。

但是,如果你真的添加功能的線程(在這種情況下,你可能需要使這些線程子類很多),然後擴展線程。

0

除非您正在使用鞦韆,否則不應使用SwingWorker

實施Runnable(選項1)是generally preferable to extending Thread

+0

但是爲什麼實現Runnable比擴展Thread更受歡迎? – 2011-08-25 21:09:53

+0

由於語義。您通常不會擴展線程行爲,而是將其用作可運行的線程。 – Farmor

+0

@pst,請參閱http://stackoverflow.com/questions/541487/java-implements-runnable-vs-extends-thread/541506#541506 –