2012-04-26 78 views
0

可能重複:
Java: 「implements Runnable」 vs. 「extends Thread」新的線程(Runnable runnableObj)比。繼承Thread

我只是想知道是否有創建繼承Thread自己的自定義對象並使用線程創建一個線程之間的一些微妙的差異(Runnable接口)構造函數?

我有一些代碼在我使用擴展線程的類時正常工作,但如果我嘗試使用通過使用線程(Runnable)構造函數創建線程的邏輯,新線程似乎不能正常工作 - 以和我使用我製作的自定義子類相同的方式檢測它們是否存在,並且它們似乎並沒有結束。

在我的代碼中,我只是產生了一些線程,然後搜索我的線程列表以找到一個活着並加入它,直到它死亡。然後我再次搜索列表中的一個線程,並將其加入到該線程中。這個過程一直持續到所有線程都死掉。

感謝您的閱讀。

+0

雖然您可以顯示您的代碼(並更改標題)以使其成爲唯一的問題,但這是重複的。 – Gray 2012-04-26 20:43:41

回答

2

線程是一種工作資源。 Runnable是一項工作。您是在創建一種新的資源類型,還是僅僅定義您想要完成的工作?

要'結束'你只需從'run'方法返回的線程。需要查看代碼示例,以查看您的意思,即無法分辨它們是否處於活動狀態。

創建Runnables當然還可以讓您的代碼在未來重構爲使用ThreadPool。

2

在我的代碼中,我只是產生了一些線程,然後搜索我的線程列表以找到一個活着並加入它,直到它死亡。

你是如何(以及爲什麼)「搜索我的線程列表」?我反而添加Thread以某種Collection,你可以再然後在迭代,並依次在每個Thread加入:

List<Thread> threads = new ArrayList<Thread(); 
    for (int i = 0; i < 100; i++) { 
    Thread thread = new Thread(new Runnable() ...); 
    thread.start(); 
    threads.add(thread); 
    } 
    ... 
    for (Thread thread : threads) { 
     thread.join(); 
    } 

更妙的是使用由Executors給出的ExecutorService S的一個。他們圍繞創建線程池並等待池完全完成有很多功能。幾乎總是建議超過new Thread(...)

我無法檢測他們還活着以同樣的方式,當我使用自定義的子類我做

如果你正在嘗試設置Thread的名字,那麼你可以在你的Runnable的構造函數中不要這樣做。你可以然而在run()方法中做這個。你可以這樣做:

new Thread(new Runnable() { 
     public void run() { 
      Thread.currentThread().setName("..."); 
     } 
    }); 

否則,我不知道爲什麼你會不會看到你的Thread除非它已經完成。

他們似乎並沒有結束,永遠。

使用Runnable,線程完成時的run()方法返回 - 無論是通過returnthrow。這與延伸Thread非常相似,所以我不確定爲什麼這不起作用。

1

我真的會推薦使用concurrency utility而不是試圖自己管理線程,這是複雜和容易出錯的。 使用併發api還可以幫助您馬上應用正確的模式。