【问题标题】:How can I reuse a thread? When are threads closed?如何重用线程?线程什么时候关闭?
【发布时间】:2013-02-12 20:50:35
【问题描述】:

我有这个代码:

    @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方法中以某种方式再次调用线程吗?或者它是否在持续运行并且当套接字不是 null 时它会“做其他事情”?

我尝试再次调用 run 函数,但出现 NullPointerException。当我在communicateListener 中创建一个新线程时它工作得很好,但我不想每次单击按钮时都创建一个新线程。

谢谢

【问题讨论】:

    标签: java android multithreading


    【解决方案1】:

    首先,永远不要调用线程的run() 方法;这不会在新线程中运行代码,它会在您当前的线程中运行它。改为调用其start() 方法(以启动一个很快将在run() 方法处的新线程)。

    当一个线程用完run()方法中的代码(或显式地从该方法中返回),该线程就结束了。该对象可能仍然存在,允许您从中提取数据(如果您想要任何东西),但是无法再次启动线程;您需要创建一个新实例并启动它。

    如果你的意图是创建一次线程并让它“做其他事情”同时等待真正的工作去做,你也可以这样做,但它与“当我启动一个新线程时启动一个新线程”是不同的使用模型。需要完成我的工作”。两种使用模型都有自己的位置,但“当我需要它时启动”模型更易于实现,而且当它与 UI 操作相关时,更复杂的模型所提供的效率不太可能足以提升重要性。

    【讨论】:

      【解决方案2】:

      在我看来,您在尝试使用它们之前没有阅读任何文档,因为很明显您对 java 中的线程一无所知。如果我在哪里,我会阅读以下章节:http://docs.oracle.com/javase/tutorial/essential/concurrency/

      但总而言之,要使线程工作:您调用“start()”,线程将自行启动,并调用“run()”函数。 当 run() 函数结束时,线程就死掉了。

      因此,如果您想再次执行相同的操作,请创建一个新的线程实例,然后重新启动它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-03
        • 1970-01-01
        • 2011-10-27
        • 2015-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多