Java 事件方法中的线程对象:使用类成员还是创建本地对象?

Java 事件方法中的线程对象:使用类成员还是创建本地对象?,java,android,memory,object,Java,Android,Memory,Object,我有一个带有事件方法的类,它经常被调用。假设方法名为:onClicked。在方法内部,我将创建一个线程来执行一些操作 首先,我尝试在事件方法内创建一个线程对象。代码如下所示: public class MyService { //Event method public void onClick() { new Thread(new Runnable() { @Override public void run()

我有一个带有事件方法的类,它经常被调用。假设方法名为:onClicked。在方法内部,我将创建一个线程来执行一些操作

首先,我尝试在事件方法内创建一个线程对象。代码如下所示:

public class MyService {

    //Event method
    public void onClick() {
        new Thread(new Runnable() {

            @Override
            public void run() {
                // do some stuff here
            }
        }).start();
    }
}
public class MyService {
    private Thread myThread;

    //Event method
    public void onClick() {
        myThread = new Thread(new Runnable() {

            @Override
            public void run() {
                  // do some stuff here
            }
        });
        myThread.start();
    }
}
但是由于onClick经常被调用,我担心每次调用事件方法时创建的新线程对象是否会产生内存空间或性能问题

或者,我可以创建一个类成员线程解决方案,如下所示:

public class MyService {

    //Event method
    public void onClick() {
        new Thread(new Runnable() {

            @Override
            public void run() {
                // do some stuff here
            }
        }).start();
    }
}
public class MyService {
    private Thread myThread;

    //Event method
    public void onClick() {
        myThread = new Thread(new Runnable() {

            @Override
            public void run() {
                  // do some stuff here
            }
        });
        myThread.start();
    }
}

那么,哪种代码更好?第一还是第二?或者还有其他更好的解决方案吗?

如果不在每个
OnClick()上重新初始化线程,就不能使用第二个代码。这是因为一旦线程完成运行,它就“死了”。因此,对
start()
的后续调用将失败,并导致
IllegalThreadStateException


最好使用第一个代码,因为GC将在完成后删除线程。

我认为这两种解决方案是相同的,因为它们每次单击
onclick
时都会创建一个新线程。第二个线程甚至可能会遇到这样的情况:创建一个新线程并将其分配给全局变量
myThread
,在调用
start
之前,另一个
onclick
事件进入并重新分配全局变量,使前一个变量永远不会启动。 我建议你去看报纸

控制此处允许的线程数,以避免资源耗尽。

创建并初始化,然后单击可以创建实现Runnable接口的自己类的任何实例。其要点是通过指定池的数量(大小)(ExecutorService:fix thread pool)避免创建太多线程。那是更好的办法


正如我所说的,您还可以进行小型重构,创建自己的类事件并实现Runnable,重点是定义构造函数,字段也可以使用其他方法。

对不起,我在第二段代码中出错了。我已经更新了。因此,使用成员线程变量的第二个代码在内存节省或性能方面与第一个代码没有任何区别?正确,因为您必须以任何方式调用thread()构造函数。这不是一个真正的问题。你每次都必须创建一个新线程,你没有选择,所以没有更好的选择。你给出的第一个解决方案和evanwong的一样,对吗?对于第二个问题(创建可运行类事件),它会提高性能吗?这里不是性能问题,更多的是设计代码。但你仍然可以玩池中的线程数。但请记住,我们正在处理移动系统(电池寿命/性能)