2013-02-12 64 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()函数结束时,线程死亡。

所以,如果你想再次做同样的动作,创建一个新的线程实例,并重新启动它。