Java - 关闭“返回”无效的线程

时间:2015-05-15 10:28:53

标签: java multithreading terminate

我在包含main方法

的类中包含以下代码
ExecutorService executor = Executors.newFixedThreadPool(1);
Runnable formatConcentration = new formatConcentration(87);
executor.execute(formatConcentration);
System.out.println("Called an instance of formatConcentration");
while (!executor.isTerminated())
{
    //stay Alive
    Thread.sleep(1000);
    System.out.println("Still alive");
}
System.out.println("Program successfully finished");
return;

这会创建一个formatConcentration类的实例。代码如下(为了示例,我已经完成了所有功能)。

public class formatConcentration extends Thread{
    private int numberOfNewRows;

    formatConcentration(int rows)
    {
        this.numberOfNewRows = rows;
    }
    public void run() {

        System.out.println("Running the Formatting Script");
        final int numberOfNewRegistered = this.numberOfNewRows;
        try 
        {
            System.out.println("Finished formatting");
        }//end of try
        catch (Exception e1) 
        {
            log.log(e1.toString());
            log.closeLog() ;
            System.exit(1) ;
        }
        System.out.println("Still Finished formatting");
        return;
    }
}

我的问题是,一旦return被调用,它就不会终止该线程。

我已经做了相当多的环顾四周,据我所知,这应该没问题,但我想我会忽略一些小事,并会欣赏这个问题的新鲜眼睛。

或者,如果有人建议如何从run(){}方法中杀死线程,我会非常感激(最好不要设置一个我将在主类中检查的变量但是如果我是这样的话必须这样做,因为我知道,一旦它到达return语句它已经完成,不再需要对run()中创建的变量的任何引用。

生成到控制台的输出如下:

Called an instance of formatConcentration
Running the Formatting Script
Finished formatting
Still Finished formatting
Still alive
Still alive
Still alive
Still alive
Still alive
etc.

3 个答案:

答案 0 :(得分:2)

您永远不会关闭executor。来自isTerminated的Javadoc:

  

如果关闭后所有任务都已完成,则返回true。请注意,除非先调用shutdown或shutdownNow,否则isTerminated永远不会为真。

只要您不关闭executor,就可以向其提交新任务以供执行。 isTerminated 检查已提交任务的状态,它会检查ExecutorService本身的状态。

答案 1 :(得分:0)

ExecutorService executor = Executors.newFixedThreadPool(1);
Runnable formatConcentration = new formatConcentration(87);
executor.execute(formatConcentration);
System.out.println("Called an instance of formatConcentration");
executor.shutdown();
while (!executor.isTerminated())
{
    //stay Alive
    Thread.sleep(1000);
    System.out.println("Still alive");
}
System.out.println("Program successfully finished");
return;

另一种更简单的方法是:

   ExecutorService executor = Executors.newFixedThreadPool(1);
    Runnable formatConcentration = new formatConcentration(87);
    executor.execute(formatConcentration);
    executor.shutdown();
    try {
        executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Executor awaitTermination方法替换你的循环。

答案 2 :(得分:0)

ExecutorService主要用于将您的工作委托给separte工作人员。 使用此选项仅创建了大多数连接池库。 因此,只要您的应用程序启动,该服务就会启动,并且将由您的应用程序的关闭方法关闭(手动)。

在你的程序中,你应该编写一个代码来检查执行程序服务的状态,

是否有工人正在工作...... 如果没有工人处于繁忙模式,那么就停止接受任何进一步的任务。

从javadocs看到示例关闭代码,

以下方法分两个阶段关闭ExecutorService,首先调用shutdown来拒绝传入的任务,然后在必要时调用shutdownNow来取消任何延迟的任务:

void shutdownAndAwaitTermination(ExecutorService pool) {
   pool.shutdown(); // Disable new tasks from being submitted
   try {
     // Wait a while for existing tasks to terminate
     if (!pool.awaitTermination(60, TimeUnit.SECONDS)) {
       pool.shutdownNow(); // Cancel currently executing tasks
       // Wait a while for tasks to respond to being cancelled
       if (!pool.awaitTermination(60, TimeUnit.SECONDS))
           System.err.println("Pool did not terminate");
     }
   } catch (InterruptedException ie) {
     // (Re-)Cancel if current thread also interrupted
     pool.shutdownNow();
     // Preserve interrupt status
     Thread.currentThread().interrupt();
   }
 }

希望它会给你一些信息。