「java终止线程池」java 终止线程
今天给各位分享java终止线程池的知识,其中也会对java 终止线程进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
java线程池中正在执行的线程彻底停止
shutdownnow()只是会尝试着结束正在运行的线程任务,如同调用Future的cancel方法,但是不保证一定能结束线程。
Java线程池在运行后的结果反查
Java线程池需要不断的学习 在学习的时候我们就要注意不少的问题 下面我们就来看看具体的语言运作环境如何才能满足Java线程池相关程序的运行 希望大家有所收获
无论是接收Runnable型参数 还是接收Callable型参数的submit()方法 都会返回一个Future(也是一个接口)类型的对象 该对象中包含了任务的执行情况以及结果 调用Future的boolean isDone()方法可以获知任务是否执行完毕 调用Object get()方法可以获得任务执行后的返回结果 如果此时任务还没有执行完 get()方法会保持等待 直到相应的任务执行完毕后 才会将结果返回
我们用下面的一个例子来演示Java 中Java线程池的使用
Java代码
import ncurrent *;
public class ExecutorTest {
public static void main(String[] args) throws
InterruptedException
ExecutionException {
ExecutorService es = Executors newSingleThreadExecutor();
Future fr = es submit(new RunnableTest());// 提交任务
Future fc = es submit(new CallableTest());// 提交任务
// 取得返回值并输出
System out println((String) fc get());
// 检查任务是否执行完毕
if (fr isDone()) {
System out println( 执行完毕 RunnableTest run() );
} else {
System out println( 未执行完 RunnableTest run() );
}
// 检查任务是否执行完毕
if (fc isDone()) {
System out println( 执行完毕 CallableTest run() );
} else {
System out println( 未执行完 CallableTest run() );
}
// 停止线程池服务
es shutdown();
}
}
class RunnableTest implements Runnable {
public void run() {
System out println( 已经执行 RunnableTest run() );
}
}
class CallableTest implements Callable {
public Object call() {
System out println( 已经执行 CallableTest call() );
return 返回值 CallableTest call() ;
}
}
import ncurrent *;
public class ExecutorTest {
public static void main(String[] args) throws
InterruptedException
ExecutionException {
ExecutorService es = Executors newSingleThreadExecutor();
Future fr = es submit(new RunnableTest());// 提交任务
Future fc = es submit(new CallableTest());// 提交任务
// 取得返回值并输出
System out println((String) fc get());
// 检查任务是否执行完毕
if (fr isDone()) {
System out println( 执行完毕 RunnableTest run() );
} else {
System out println( 未执行完 RunnableTest run() );
}
// 检查任务是否执行完毕
if (fc isDone()) {
System out println( 执行完毕 CallableTest run() );
} else {
System out println( 未执行完 CallableTest run() );
}
// 停止线程池服务
es shutdown();
}
}
class RunnableTest implements Runnable {
public void run() {
System out println( 已经执行 RunnableTest run() );
}
}
class CallableTest implements Callable {
public Object call() {
System out println( 已经执行 CallableTest call() );
return 返回值 CallableTest call() ;
}
}
运行结果
已经执行 RunnableTest run()
已经执行 CallableTest call()
返回值 CallableTest call()
执行完毕 RunnableTest run()
执行完毕 CallableTest run()
lishixinzhi/Article/program/Java/gj/201311/27283
如何优雅的关闭线程池?
线程池是系统资源,这篇文章主要介绍如何优雅关闭线程池
相关API:
Runtime.addShutdownHook解释
如果你想在jvm关闭的时候进行内存清理、对象销毁等操作,或者仅仅想起个线程然后这个线程不会退出,你可以使用Runtime.addShutdownHook。
这个方法的作用就是在JVM中增加一个关闭的钩子。当程序正常退出、系统调用 System.exit方法或者虚拟机被关闭时才会执行系统中已经设置的所有钩子,当系统执行完这些钩子后,JVM才会关闭。所谓钩子,就是一个已初始化但并不启动的线程。JVM退出通常通过两种事件。
程序正常退出,例如最后一个非守护进程退出、使用System.exit()退出等
程序异常退出,例如使用Ctrl+C触发的中断、用户退出或系统关闭等系统事件等 , 详情见官方文档:
Guava解释
google退出的open sdk,提供多类并发api。
上两篇文章讲了@Configuration @Bean @Import注入线程池Bean,还有ApplicationRunner 和 CommandLineRunner接口去实现容器启动完成事件驱动,所以结合起来举个例子,在项目中如何注入、优雅关闭线程池。
如上图。
1.通过@Configuration @Bean注解去注入一个线程池componentThreadPool。
2.将线程池注册到注册中心ThreadPoolRegistrationCenter
3.在Spring容器启动完成观察者模式中,利用ApplicationRunner接口提供的run方法,添加jvm hook钩子,以做到jvm退出时能够优雅关闭线程池。
其中用到了guava的MoreExecutors.shutdownAndAwaitTermination,jdkRuntime.getRuntime().addShutdownHook等API
JAVA线程池shutdown和shutdownNow的区别
线程池:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空闲(如正在等待某个事件),则线程池将插入另一个辅助线程来使所有处理器保持繁忙。如果所有线程池线程都始终保持繁忙,但队列中包含挂起的工作,则线程池将在一段时间后创建另一个辅助线程但线程的数目永远不会超过最大值。超过最大值的线程可以排队,但他们要等到其他线程完成后才启动。
以下是引用网络答案:
shutDown()
当线程池调用该方法时,线程池的状态则立刻变成SHUTDOWN状态。此时,则不能再往线程池中添加任何任务,否则将会抛出RejectedExecutionException异常。但是,此时线程池不会立刻退出,直到添加到线程池中的任务都已经处理完成,才会退出。
shutdownNow()
根据JDK文档描述,大致意思是:执行该方法,线程池的状态立刻变成STOP状态,并试图停止所有正在执行的线程,不再处理还在池队列中等待的任务,当然,它会返回那些未执行的任务。
它试图终止线程的方法是通过调用Thread.interrupt()方法来实现的,但是大家知道,这种方法的作用有限,如果线程中没有sleep 、wait、Condition、定时锁等应用, interrupt()方法是无法中断当前的线程的。所以,ShutdownNow()并不代表线程池就一定立即就能退出,它可能必须要等待所有正在执行的任务都执行完成了才能退出。
上面对shutDown()以及shutDownNow()作了一个简单的、理论上的分析。如果想知道why,则需要亲自打开JDK源码,分析分析。
想要分析shutDown()以及shutDownNow()源码,我建议首先要对ThreadPoolExecutor有个大概了解。因为关闭线程池的所有方法逻辑都在ThreadPoolExecutor中处理的。
java线程池请教
ExecutorService可以先调用一次shutdown()方法终止传入新的任务,此时已经传入的任务仍然会继续执行。T FutureT submit(CallableT task),你在提交callable任务时就要保留每个任务对应的Future结果列表。调用线程池的pool.awaitTermination(60, TimeUnit.SECONDS)) 方法等待一会儿,然后去调用结果列表中Future的get方法,根据get方法返回的结果值判断当前任务是否正常执行结束。如果所有的任务的future结果都正常,则调用线程池的shutdownNow()方法销毁线程池。
关于java终止线程池和java 终止线程的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。