我有这个代码:
@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创建线程和建立连接的线程。然后,单击“communicateListener”后,应用程序将从套接字读取或写入。我不知道如何实现这个。
我应该在communicateListener的onclick方法中再次调用线程吗?或者它是否连续运行并且当套接字不为空时它会“执行其他操作”?
我尝试再次调用 run 函数,但出现 NullPointerException。当我在communicateListener中创建一个新线程时它工作得很好,但我不想每次单击按钮时都创建一个新线程。
谢谢
最佳答案
首先,永远不要调用线程的 run()
方法;它不会在新线程中运行代码,而是在当前线程中运行它。改为调用其 start()
方法(启动一个很快将位于 run()
方法的新线程)。
当线程用完 run()
方法中的代码(或显式从该方法返回)时,该线程就结束了。该对象可能仍然存在,允许您从中提取数据(如果有您想要的任何内容),但是线程无法再次启动;您需要创建一个新实例并启动它。
如果您的目的是创建一个线程一次并让它在等待实际工作完成时“做其他事情”,您也可以这样做,但这是一个与“当我启动一个新线程时启动一个新线程”不同的使用模型需要完成我的工作”。两种使用模型都有自己的位置,但“需要时启动”模型更容易实现,而且当它与 UI 操作相关时,更复杂的模型所提供的效率不太可能足以提高效率。
关于java - 如何重用线程?线程什么时候关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14832742/