使用线程池的好处:
1.减少在创建和销毁线程上所花的时间以及系统资源的开销
2.如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。
3.如果在web应用中使用线程,如timer,但是需要设置守护线程,这样在tomcat关闭时,线程也随之关闭。但有些线程不会随着tomcat的关闭而关闭。如:thread 。所以一般需要用线程池统一管理
项目应用的例子
1.线程池执行timer定时任务
ScheduledExecutorService scheduled_pool = Executors.newScheduledThreadPool(1);
Calendar currentDate = Calendar.getInstance();
System.out.println(currentDate.getTime());
long now = currentDate.getTime().getTime();
currentDate.add(Calendar.SECOND, 10);
//Date date = calendar.getTime();
long delay = currentDate.getTime().getTime()-now ;
long interval = 10*1000;
System.out.println(delay);
scheduled_pool.scheduleAtFixedRate(new TestTimerRunable(), delay, interval,TimeUnit.MILLISECONDS);
线程池执行thread线程
ScheduledExecutorService scheduled_pool = Executors.newScheduledThreadPool(1);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});
thread.setDaemon(true);//线程设置为守护线程 则容器关闭后,这些守护线程会立即关闭
scheduled_pool.execute(thread);
2.web应用
1)web.xml中配置监听器,在系统启动时加载线程池
<listener-class>
com.xxx.common.listener.ThreadPoolListener
</listener-class>
2)监听器配置
public class ThreadPoolListener implements ServletContextListener{
public static ScheduledExecutorService scheduled_pool = Executors.newScheduledThreadPool(10);
private Logger log = LoggerFactory.getLogger(this.getClass());
@Override
public void contextDestroyed(ServletContextEvent arg0) {
scheduled_pool.shutdown();//关闭线程池
if (!scheduled_pool.isShutdown()) {
try {
Thread.currentThread().wait(5000);
if (!scheduled_pool.isShutdown()) {
scheduled_pool.shutdownNow();//关闭线程池 (强行关闭)
}
} catch (InterruptedException e) {
log.error("关闭所有线程错误",e.getMessage());
} finally{
if (!scheduled_pool.isShutdown()) {
scheduled_pool.shutdownNow();
}
}
}
log.info("所有线程关闭"+scheduled_pool.isShutdown());
}
@Override
public void contextInitialized(ServletContextEvent arg0) {
}
}
分享到:
相关推荐
这是一个jar,很秀。自定义的一个Java定时器工具类。主要是结合Spring Boot一起使用,并在Spring Boot启动的时候一起启动运行。
Android线程池管理的代码例子。用于演示普通线程池ThreadPoolExecutor、定时器线程池ScheduledExecutorService等功能。
您可以在工作线程上运行任务(Runnable或Callable),以指定执行计划(如ScheduledExecutorService),并指定执行时间。 介面 ScheduledFuture<?> schedule( Runnable command, int executeTime, long delay,...
ScheduledExecutorService 的测试实用程序实现 允许测试如下代码: class Foo { private int count = 0; public Foo(ScheduledExecutorService service, Bar bar) { service.scheduleAtFixedRate(new Runnable...
定时器小例子,这是一个经较好定时器应用
|--时间之自动任务ScheduledExecutorService |--时间之记时器 |--时间日期格式化 |--服务之判断是否处于运行状态 |--服务之定义录音机 |--服务之应用内绑定服务调用方法 |--服务之电话录音 |--服务之看门狗代码示例 ...
看完《think in java》多线程章节,自己写的多线程文档,还结合了其他的相关网络资料。...13)安排线程池ScheduledExecutorService 40 五多线程面试题 41 六其他主题 41 1)ReentrantLock和synchronized关键字的区别 41
主要介绍了ScheduledExecutorService任务定时代码示例,具有一定借鉴价值,需要的朋友可以参考下
ScheduledExecutorService 计时器任务处理,用于超时处理。
该线程池中, 核心线程池长度为0, 线程池最大长度为Integer.MAX_VALUE.以SynchronousQueue作为等待队列, 从而每次往队列中插入一个元素, 必须等待另一个线程从这个队列删除一个元素. 定时调度 4.定时调度的线程池 ...
下面小编就为大家带来一篇基于ScheduledExecutorService的两种方法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
5.0里提供了一个新的任务执行架构使你可以轻松地调度和控制任务的执行,并且可以建立一个类似数据库连接 池的线程池来执行任务。这个架构主要有三个接口和其相应的具体类组成。这三个接口是Executor, ...
工作中常常会有定时任务的开发需求,特别是移动端。最近笔者正好有所涉及,鉴于此,结合开发中的案例说明一下几种定时任务的 退出 。 需求说明 :定时更新正在生成...ScheduledExecutorService的初始化(线程池):
Java多线程入阶干货分享 1.使用线程的经验:设置名称、响应中断、使用ThreadLocal 2.Executor:ExecutorService和...8.定时器:ScheduledExecutorService、大规模定时器TimerWheel 9.并发三大定律 10.图书、相关网络资源
1、使用线程的经验:设置...8、定时器: ScheduledExecutorService、大规模定时器TimerWheel 9、并发三大定律:Amdahl、Gustafson、Sun-Ni 10、神人和图书、相关网络资源 11、业界发展情况: GPGPU、OpenCL 12、复习题
内容列表 1、使用线程的经验:设置名称、...8、定时器: ScheduledExecutorService、大规模定时器TimerWheel 9、并发三大定律:Amdahl、Gustafson、Sun-Ni 10、神人和图书 11、业界发展情况: GPGPU、OpenCL 12、复习题
1、使用线程的经验:设置名称、响应中断、...8、定时器: ScheduledExecutorService、大规模定时器TimerWheel 9、并发三大定律:Amdahl、Gustafson、Sun-Ni 10、神人和图书 11、业界发展情况: GPGPU、OpenCL 12、复习题
Springmvc java注解设置定时任务实例,利用 ScheduledExecutorService 接口实现
中英文版的 pdf 均带有书签,方便读者朋友查阅。 java_util_concurrent_user_guide_cn.pdf 内容预览: 1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4...