2011-12-14 81 views
0

我有一些单线程类被一些线程共享。在单例中创建线程

这个单我想创建另一个线程做一些工作的方法中现在(因此使用这个单身任何线程可以启动附加线程任务)

我简单的方法启动线程:

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

主题mSThread被声明为类的成员,我不认为我需要保持参考线程所以它的确定,每创建一个新的线程的引用将丢失

时间是否确定去做我或我所做的事情d使用不同的技术,如线程池?

+1

我没有看到单身人士与它有什么关系。你有一个方法,任何调用它的人都会产生一个新的线程,直到完成为止。没关系,只要你不会频繁地调用它,那你就创建了太多的线程。在这种情况下,线程池是更好的。但是你提供的信息太少,不能给出好的建议,所以请详细说明一下。 – 2011-12-14 18:59:43

+0

为什么你不这样做: (new Thread(实现Runnable的作业))。start();在你的方法?这应该做到这一点。 – eboix 2011-12-14 19:01:36

回答

3

保留对线程对象的引用并不是绝对必要的,所以如果你不需要它的话,你不需要将它存储在一个成员变量中;你可以开始线程并忘记参考。

你是否应该使用线程池,取决于你的应用程序到底做了什么,你希望多久开始一次新线程等等。没有进一步的信息,很难说这是否值得。如果你这样做,你会想要使用java.util.concurrent包中的类。使用ExecutorService您可以在线程池中启动后台任务。

0

在我看来没关系。

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

另一个问题是您想跟踪为管理(JMX)创建的线程数?

0

主题mSThread被声明为类的成员,

你的意思是单身的实例变量?如果是这样,你可能有问题。更好地使它成为一个局部变量。

1

线程是运行时的稀缺资源。每次调用方法时产生一个新的代码都是浪费的 - 尤其是因为在你的情况下,你所关心的只是调用线程不被阻塞。所以,你应该确保你的方法不会经常被调用。

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

为了防止发生这种情况,您可能需要考虑使用线程池 - 它可以防止未来的意外误操作 - 尤其是因为Sun/Oracle提供了令人敬畏的java.util.concurrent包,它可以抽象出大部分混乱的细节。