繁体   English   中英

在单例中创建线程

[英]Creating threads within singleton

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

在此单例的方法中,我想创建另一个线程来完成某项工作(因此,使用此单例的任何线程都可以启动其他线程工作)

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

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

线程mSThread被声明为类成员,我不认为我需要保留对线程的引用,因此每次创建新线程时,引用都会丢失

是否可以做我所做的事情,还是应该使用其他技术(例如线程池)?

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

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

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

目前 ,从评论来看,您似乎已经做到了。 您还应该记录一下不要频繁调用您的方法的期望。 但是,将来的一些同事可能会意外丢失此文档,并将其称为紧密循环。

为了防止这种情况的发生,您可能要考虑使用线程池-它可以防止将来的意外滥用-特别是因为Sun / Oracle提供了很棒的java.util.concurrent程序包,该程序包抽象了大多数混乱的细节。

我认为还可以。

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

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

线程mSThread被声明为类成员,

您是说它是单例的实例变量吗? 如果是这样,您可能会遇到问题。 最好将其设置为局部变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM