我有一个由一些线程共享的单例类。
在这个单例的方法中我想创建另一个线程来做一些工作(所以任何使用这个单例的线程都可以启动额外的线程工作)
现在我以简单的方式启动线程:
mSThread = new Thread(job that implements Runnable);
mSThread.start();
线程mSThread被声明为类成员,我不认为我需要保持对线程的引用,所以每次创建新线程时都可以丢失引用
可以做我做的事情,或者我应该使用不同的技术,如线程池?
答案 0 :(得分:3)
保持对线程对象的引用并不是绝对必要的,因此如果您不需要其他任何内容,则不需要将其存储在成员变量中;你可以启动线程并忘记引用。
是否应该使用线程池,取决于您的应用程序的确切功能,启动新线程的频率等等;没有进一步的信息,很难说这是否值得。如果这样做,您将需要使用java.util.concurrent
包中的类。使用ExecutorService
,您可以在线程池中启动后台任务。
答案 1 :(得分:1)
线程是运行时的稀缺资源。每次调用方法时产生一个新的都是浪费 - 特别是因为在你的情况下,似乎所有你关心的是调用线程不被阻止。因此,您应该确保不会经常调用您的方法。
目前,从评论中,您似乎已经这样做了。您还应记录不应经常调用方法的期望。然而,一些未来的同事可能会意外地错过这些文档并将其称为紧密循环。
为了防止出现这种情况,您可能需要考虑使用线程池 - 它可以防止将来意外滥用 - 特别是因为Sun / Oracle提供了令人敬畏的java.util.concurrent
程序包,它抽象掉了大部分混乱的细节。
答案 2 :(得分:0)
我认为没问题。
你真正面对的可能是一个不成熟的优化问题。线程创建的频率是多少?你的应用程序是否会变得忙碌,这会成为一个问题?在您的目标平台上,创建新线程需要多少资源和时间,这是可以接受的吗?
另一个问题是,您是否希望跟踪为管理(JMX)目的而创建的线程数?
答案 3 :(得分:0)
线程mSThread声明为类成员,
你的意思是它是单身人士的实例变量吗?如果是这样,你可能会有问题。最好将它变成局部变量。