java:当前线程处于活动状态时不要启动其他线程

java:当前线程处于活动状态时不要启动其他线程,java,multithreading,locking,Java,Multithreading,Locking,我有方法“开始”的主线程。此方法启动另一个线程,即执行长任务。方法“start”可以从其他线程调用。如果已经有一个线程在运行并且没有锁定主线程,如何避免在“start”方法中创建新线程?我尝试使用singleThreadExecutor,但它会对任务进行排队 代码: 启动方法: public void start(){ // need only one active thread // if thread alive, avoid to start another t = ne

我有方法“开始”的主线程。此方法启动另一个线程,即执行长任务。方法“start”可以从其他线程调用。如果已经有一个线程在运行并且没有锁定主线程,如何避免在“start”方法中创建新线程?我尝试使用singleThreadExecutor,但它会对任务进行排队

代码: 启动方法:

 public void start(){
// need only one active thread
// if thread alive, avoid to start another
        t = new Thread( new Runnable() {
            public void run() {
                try {
                    Thread.currentThread().sleep(3000);     
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();      
    }
简单测试

    for (int i = 0; i < 100; i++) {
            Thread r = new Thread( new Runnable() {
                public void run() {
                    Helper.getInstance().start();
                }
            });
            r.start();      
   }    
for(int i=0;i<100;i++){
线程r=新线程(新可运行(){
公开募捐{
Helper.getInstance().start();
}
});
r、 start();
}    

如果您想在当前线程繁忙时丢弃新任务,您可以使用SingleThreadExecutor并将其配置为,而不是将其排队。

使用大小为1的线程池。如果线程已在运行,您想将第二个作业排队,还是忽略它?SingleThreadExecutor不会对线程排队。它对任务进行排队(但是在您的情况下,您可能错误地将任务编入线程)。@Thilo只需忽略它即可检查
t!=在启动另一个之前,请使用null&&t.isAlive()
。或者使用SingleThreadExecutor并将其配置为不排队,而是放弃。