2013-02-12 24 views
0

我有這樣的代碼:我如何重用一個線程?線程什麼時候關閉?

@Override 
    public void onClick(View v) { 
     if (!connected) { 
      serverIpAddress = serverIp.getText().toString(); 
      if (!serverIpAddress.equals("")) { 
       Thread cThread = new Thread(new ClientThread()); 
       cThread.start();     
      } 
     } 
    } 
}; 

private OnClickListener communicateListener = new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     message = messageServer.getText().toString(); 
     if (!serverIpAddress.equals("")) { 
      cThread.run(); 
      //Thread cThread = new Thread(new ClientThread()); 
      //cThread.start(); 
     }     

    } 
}; 

public class ClientThread implements Runnable { 

    public void run() {   
      if (socket==null) 
       connect to the server; 
      else 
       do smth else; 
    } 

我要的是connectListener創建線程和線程建立連接。然後,在單擊communicisteListener時,應用程序將從套接字讀取或寫入它。我不知道如何實現這一點。

我應該再次調用這個線程以某種方式在communicatorListener的onclick方法中?或者它連續運行,並且當socket不是null時它會「做其他的事情」?

我試着再次調用運行函數,但我得到了一個N​​ullPointerException。當我在communicateListener中創建一個新線程時它工作得很好,但我不想每次單擊按鈕時都創建一個新線程。

謝謝

回答

3

首先,永遠不會調用線程的run()方法;它不會在新線程中運行代碼,它會在當前線程中運行它。改爲調用它的start()方法(以啓動一個新線程,該線程很快將在run()方法中)。

當線程用完run()方法中的代碼(或顯式返回方法)時,該線程結束。該對象可能仍然存在,允許您從中提取數據(如果有任何您想要的),但該線程不能再次啓動;您需要創建一個新實例並啓動它。

如果你的意圖是創建一個線程並讓它在等待真正的工作時「做其他事情」,你也可以這樣做,但它是一個不同的使用模型,而不是「啓動一個新線程時我需要完成我的工作「。這兩種使用模式都有自己的位置,但是「我需要時啓動它」的模型更容易實現,而且這種更復雜的模型所提供的效率不太可能足以促進與UI操作綁定。

1

在我看來,您在嘗試使用它們之前沒有閱讀過任何文檔,因爲很明顯,您對Java中的線程沒有任何理解。如果我在哪裏,我會閱讀以下章節:http://docs.oracle.com/javase/tutorial/essential/concurrency/

但總結一下,使一個線程工作:你調用「start()」,線程將自行啓動,並調用「run() 「功能。 當run()函數結束時,線程死亡。

所以,如果你想再次做同樣的動作,創建一個新的線程實例,並重新啓動它。