Java 在singleton中创建线程

Java 在singleton中创建线程,java,multithreading,singleton,Java,Multithreading,Singleton,我有一个由一些线程共享的单例类 在这个单例的一个方法中,我想创建另一个线程来做一些工作(这样使用这个单例的任何线程都可以启动额外的线程工作) 现在,我以简单的方式启动线程: mSThread = new Thread(job that implements Runnable); mSThread.start(); 线程mSThread被声明为类成员,我不认为我需要保留对线程的引用,所以每次创建一个新线程时,引用都会丢失是可以的 这样做可以吗?或者我应该使用不同的技术,比如线程池 保留对thre

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

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

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

mSThread = new Thread(job that implements Runnable);
mSThread.start();
线程mSThread被声明为类成员,我不认为我需要保留对线程的引用,所以每次创建一个新线程时,引用都会丢失是可以的


这样做可以吗?或者我应该使用不同的技术,比如线程池

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


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

不一定要保留对线程对象的引用,因此,如果您不需要它做任何其他事情,则不需要将其存储在成员变量中;您可以只启动线程而忘记引用

您是否应该使用线程池,取决于您的应用程序具体做什么,您希望启动新线程的频率,等等。;没有进一步的信息,很难说这是否值得。如果这样做,您将希望使用
java.util.concurrent
包中的类。使用执行器服务可以在线程池中启动后台任务。

我认为这没问题

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

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

我认为这没问题

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

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

线程mSThread被声明为类成员

您的意思是它是singleton的一个实例变量吗?如果是这样,你可能会有问题。最好将其设置为局部变量

线程mSThread被声明为类成员


您的意思是它是singleton的一个实例变量吗?如果是这样,你可能会有问题。最好将其设置为局部变量。

线程是运行时的稀缺资源。每次调用您的方法时生成一个新的线程是浪费的,尤其是在您的情况下,您所关心的似乎只是不阻塞调用线程。因此,您应该确保您的方法不会经常被调用

现在,从评论来看,你似乎已经做到了。您还应该记录不应该频繁调用方法的期望。然而,一些未来的同事可能会意外地错过此文档,并将其称为紧密循环


为了防止此类事件发生,您可能需要考虑使用线程池——它防止将来意外误用——尤其是因为Sun/Oracle提供了令人敬畏的<代码> java .UTI.Outual包,它抽象掉了大部分杂乱的细节。p> 线程是运行时的稀缺资源。每次调用您的方法时生成一个新的线程是浪费的,尤其是在您的情况下,您所关心的似乎只是不阻塞调用线程。因此,您应该确保您的方法不会经常被调用

现在,从评论来看,你似乎已经做到了。您还应该记录不应该频繁调用方法的期望。然而,一些未来的同事可能会意外地错过此文档,并将其称为紧密循环


为了防止此类事件发生,您可能需要考虑使用线程池——它防止将来意外误用——尤其是因为Sun/Oracle提供了令人敬畏的<代码> java .UTI.Outual包,它抽象掉了大部分杂乱的细节。p> 我不明白单身与此有什么关系。您有一个方法,任何调用该方法的人都将生成一个新线程,该线程将一直运行到完成为止。这很好,只要您不经常调用它,以免创建太多线程。在这种情况下,是的,线程池更好。但是您提供的信息太少,无法给出好的建议,所以请详细说明一下;用你的方法?应该可以了。谢谢,但我不知道我还应该添加什么:),最大产卵数是20-30个…我不知道有一个独生子有什么关系。您有一个方法,任何调用该方法的人都将生成一个新线程,该线程将一直运行到完成为止。这很好,只要您不经常调用它,以免创建太多线程。在这种情况下,是的,线程池更好。但是您提供的信息太少,无法给出好的建议,所以请详细说明一下;用你的方法?应该可以了。谢谢,但我不知道我还应该添加什么:),最大产卵数是20-30…这是单体的变量,但我不使用它