Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程池中的等待终止不';t终止线程池_Java_Multithreading - Fatal编程技术网

Java 线程池中的等待终止不';t终止线程池

Java 线程池中的等待终止不';t终止线程池,java,multithreading,Java,Multithreading,如果downloadTimeout设置为180秒,则线程应该终止,程序应该正确结束?否。超时是您希望等待的时间。线程池将在执行其所有任务时终止 如果调用shutdown(),线程池将不会将新作业排队(但不会停止正在运行的作业,并将运行已经排队的作业) 如果调用shutdownNow(),它将不会启动任何新作业,并将向工作线程发送中断。如果Runnables正确检查中断并自动终止,则池将快速停止。否则,它相当于shutdown() 在Java中,没有强制终止线程的方法(thread.stop()不

如果downloadTimeout设置为180秒,则线程应该终止,程序应该正确结束?

否。超时是您希望等待的时间。线程池将在执行其所有任务时终止

如果调用
shutdown()
,线程池将不会将新作业排队(但不会停止正在运行的作业,并将运行已经排队的作业)

如果调用
shutdownNow()
,它将不会启动任何新作业,并将向工作线程发送中断。如果
Runnable
s正确检查中断并自动终止,则池将快速停止。否则,它相当于
shutdown()

在Java中,没有强制终止线程的方法(
thread.stop()
不推荐使用,因为它容易导致资源泄漏和死锁)。您只能要求线程终止(调用其
interrupt()
方法),但由您的代码定期检查
thread.interrupted()
并正确使用
InterruptedException
s

礼貌员工的一个例子是:

 if (isDownloadLogRequired) {
        ExecutorService pool = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
        for (HostGenericServiceTicket hostGenericServiceTicket : hostGenericServiceTickets) {
            pool.submit(new DiagnosticLogDownloader(logNames, downloadTo, hostGenericServiceTicket));
        }
        pool.shutdown();
        try {
            pool.awaitTermination(downloadTimeout, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            System.err.println(MessageFormat.format("{0}: Reason: {1}", e.getClass()
                    .getSimpleName(), e.getMessage()));
        }
    }

不,超时是指您要等待的时间。线程池将在执行其所有任务时终止

如果调用
shutdown()
,线程池将不会将新作业排队(但不会停止正在运行的作业,并将运行已经排队的作业)

如果调用
shutdownNow()
,它将不会启动任何新作业,并将向工作线程发送中断。如果
Runnable
s正确检查中断并自动终止,则池将快速停止。否则,它相当于
shutdown()

在Java中,没有强制终止线程的方法(
thread.stop()
不推荐使用,因为它容易导致资源泄漏和死锁)。您只能要求线程终止(调用其
interrupt()
方法),但由您的代码定期检查
thread.interrupted()
并正确使用
InterruptedException
s

礼貌员工的一个例子是:

 if (isDownloadLogRequired) {
        ExecutorService pool = Executors.newFixedThreadPool(THREAD_POOL_SIZE);
        for (HostGenericServiceTicket hostGenericServiceTicket : hostGenericServiceTickets) {
            pool.submit(new DiagnosticLogDownloader(logNames, downloadTo, hostGenericServiceTicket));
        }
        pool.shutdown();
        try {
            pool.awaitTermination(downloadTimeout, TimeUnit.SECONDS);
        } catch (InterruptedException e) {
            System.err.println(MessageFormat.format("{0}: Reason: {1}", e.getClass()
                    .getSimpleName(), e.getMessage()));
        }
    }

但是为什么这个API的描述是这样的呢布尔等待终止(long timeout,TimeUnit)抛出InterruptedException块,直到所有任务在关闭请求后完成执行,或者超时发生,或者当前线程中断,以先发生的为准。是的,这正是我所说的“以先发生的为准“。它实际上不执行任何终止线程的操作。那么程序应该在超时后向前移动并正确结束?。。。它应该只在超时秒数内阻塞,然后向前移动。。。当我的程序死掉时,所有线程都应该随之死掉,对吗?。。。我的意思是,在我的情况下,超时首先发生。。。那么代码在这个调用中不再阻塞并向前移动了吗?不。线程池的线程不是后台线程。因此,即使启动它们的线程终止,它们也将继续存在。如果希望执行器使用后台线程,可以向其传递自定义
ThreadFactory
。但即使如此,池也可能不会终止,因为它可能使用一个“管理器”线程,这是一个前台线程(我不确定最后一件事),这样我的程序就不会退出了?我的意思是,如果线程继续运行就可以了,但至少程序应该停止阻塞并正确退出?但是为什么这个API的描述是这样的呢布尔等待终止(long timeout,TimeUnit)抛出InterruptedException块,直到所有任务在关闭请求后完成执行,或者超时发生,或者当前线程中断,以先发生的为准。是的,这正是我所说的“以先发生的为准“。它实际上不执行任何终止线程的操作。那么程序应该在超时后向前移动并正确结束?。。。它应该只在超时秒数内阻塞,然后向前移动。。。当我的程序死掉时,所有线程都应该随之死掉,对吗?。。。我的意思是,在我的情况下,超时首先发生。。。那么代码在这个调用中不再阻塞并向前移动了吗?不。线程池的线程不是后台线程。因此,即使启动它们的线程终止,它们也将继续存在。如果希望执行器使用后台线程,可以向其传递自定义
ThreadFactory
。但即使如此,池也可能不会终止,因为它可能使用一个“管理器”线程,这是一个前台线程(我不确定最后一件事),这样我的程序就不会退出了?我的意思是,如果线程继续运行就可以了,但至少程序应该停止阻塞并退出,对吗?