java - 如何重用线程?线程什么时候关闭?

标签 java android multithreading

我有这个代码:

    @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/

相关文章:

java - JDBC(mysql)在堆内存中保存查询

java - 如何从终端将我的 Gradle 项目作为 JAR 运行

android - 为什么当我的 Android 应用程序在我的服务器上调用我的 API 时,我得到一个空响应?

java - 以给定的执行时间启动线程

java - 最后一个线程没有执行

java - 如何手动设置每个 "page"的哈希值

java - UIMA 环境中的 Ruta。在纯 Java 中使用预定义的集合/集合和词典

android - 在 Cordova 插件中创建自定义的 android.app.Application

android - 数据绑定(bind)在 fragment 和 Activity 之间表现出意外

c++ - 在 C++ 中像这样自动化互斥安全吗?