在单例内创建线程

时间:2011-12-14 18:53:13

标签: java multithreading singleton

我有一个由一些线程共享的单例类。

在这个单例的方法中我想创建另一个线程来做一些工作(所以任何使用这个单例的线程都可以启动额外的线程工作)

现在我以简单的方式启动线程:

mSThread = new Thread(job that implements Runnable);
mSThread.start();

线程mSThread被声明为类成员,我不认为我需要保持对线程的引用,所以每次创建新线程时都可以丢失引用

可以做我做的事情,或者我应该使用不同的技术,如线程池?

4 个答案:

答案 0 :(得分:3)

保持对线程对象的引用并不是绝对必要的,因此如果您不需要其他任何内容,则不需要将其存储在成员变量中;你可以启动线程并忘记引用。

是否应该使用线程池,取决于您的应用程序的确切功能,启动新线程的频率等等;没有进一步的信息,很难说这是否值得。如果这样做,您将需要使用java.util.concurrent包中的类。使用ExecutorService,您可以在线程池中启动后台任务。

答案 1 :(得分:1)

线程是运行时的稀缺资源。每次调用方法时产生一个新的都是浪费 - 特别是因为在你的情况下,似乎所有你关心的是调用线程不被阻止。因此,您应该确保不会经常调用您的方法。

目前,从评论中,您似乎已经这样做了。您还应记录不应经常调用方法的期望。然而,一些未来的同事可能会意外地错过这些文档并将其称为紧密循环。

为了防止出现这种情况,您可能需要考虑使用线程池 - 它可以防止将来意外滥用 - 特别是因为Sun / Oracle提供了令人敬畏的java.util.concurrent程序包,它抽象掉了大部分混乱的细节。

答案 2 :(得分:0)

我认为没问题。

你真正面对的可能是一个不成熟的优化问题。线程创建的频率是多少?你的应用程序是否会变得忙碌,这会成为一个问题?在您的目标平台上,创建新线程需要多少资源和时间,这是可以接受的吗?

另一个问题是,您是否希望跟踪为管理(JMX)目的而创建的线程数?

答案 3 :(得分:0)

  

线程mSThread声明为类成员,

你的意思是它是单身人士的实例变量吗?如果是这样,你可能会有问题。最好将它变成局部变量。