1

我有一个带有事件方法的类,它经常被调用。假设方法名称是:onClicked。在方法内部,我会创建一个线程来做一些事情。

首先,我尝试在事件方法中创建一个线程对象。代码是这样的:

public class MyService {

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

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

但是由于经常会调用 onClick,所以我担心每次调用事件方法时创建的新线程对象是否会产生内存空间或性能问题?

或者,我可以像这样创建一个类成员线程解决方案:

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();
    }
}

那么哪个代码更好呢?第一还是第二?还是有其他更好的解决方案?

4

3 回答 3

3

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

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

于 2012-04-13T04:05:39.307 回答
0

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

线程池执行器

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

于 2012-04-13T04:37:27.670 回答
0

创建并初始化ExecutorService然后 onClick 您可以创建您自己的实现 Runnable 接口的类的任何实例。它的要点是通过指定池的数量(大小)来避免创建过多的线程(ExecutorService:修复线程池)。这是一个更好的方法。

正如我所说,你也可以进行小的重构,创建自己的类事件并实现 Runnable,重点是定义构造函数,字段也可以是一些额外的方法。

于 2012-04-13T05:04:53.117 回答