常见线程池 newScheduledThreadPool 定时执行任务的线程池 简单介绍
一 定时任务
package com.aaa.threaddemo; import static java.util.concurrent.TimeUnit.NANOSECONDS; import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import javax.xml.crypto.Data; /*
* 一 newScheduledThreadPool 是个啥?
* 1 是一个线程池
* 2 可定时执行任务
* 3 核心线程数是固定的
* 4 非核心线程数 2147483647
*
*
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
} public ScheduledThreadPoolExecutor(int corePoolSize) {
super(
corePoolSize,
Integer.MAX_VALUE,
0, //非核心线程的生存时间是 0 马上回收。
NANOSECONDS,
new DelayedWorkQueue()); //一个优先级的队列 阻塞的队列,因为它实现了BlockingQueue } DelayedWorkQueue() 优先级队列怎么用的?
队列一般都是先进先出的,但是在定时/延时任务中,我们需要的是延迟时间短的任务先执行。
为了解决这个问题,需要用到一种特殊的队列
【优先级队列】
对插入的数据进行优先级的排序,保证优先级高的数据先执行。和往队列中插入的顺序无关。
没能深入调查。。。。 二 提供了两个方法可以用 schedule(command, delay, unit) schedule(
task, 需要执行的任务
3, 间隔的时间
TimeUnit.SECONDS 时间单位 秒 分 时 。。。
); scheduleAtFixedRate(
command,
initialDelay, 初次执行 间隔的时间
period, 再次执行的相隔时间
unit 时间的单位
)
【注意!】
如果只有一次间隔时间,线程结束后关闭线程池即可。 schedule(command, delay, unit)
但是当有二次间隔时间,是不能将线程池 shutdown的! scheduleAtFixedRate(command, initialDelay, period, unit) *
*/
public class ScheduledThreadPoolDemo {
public static void main(String[] args) {
Integer integer = new Integer(0);
int maxValue = integer.MAX_VALUE;
System.out.println("[Integer.MAX_VALUE] = " + maxValue); SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //验证是否是在三秒后执行
System.out.println(df2.format(System.currentTimeMillis())); ExecutorService scheduledPool = Executors.newScheduledThreadPool(1); //创建定时的线程池 核心数量 2
ScheduledThreadDemo thread = new ScheduledThreadDemo(); Runnable task2 = new Runnable() {
public void run() {
System.out.println("开启任务 task2");
}
}; ((ScheduledExecutorService) scheduledPool).schedule(thread,3,TimeUnit.SECONDS); //1.对于thread 2. 延迟时间3后执行任务 3.单位TimeUnit.SECONDS 是 【秒】 三秒后执行
((ScheduledExecutorService) scheduledPool).schedule(task2,5,TimeUnit.SECONDS); //延迟5秒后执行任务 scheduledPool.shutdown();
}
} class ScheduledThreadDemo extends Thread{
@Override
public void run() {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(df.format(System.currentTimeMillis()));
System.out.println("我是线程1, 我在运行");
System.out.println("正在运行的线程名字" + Thread.currentThread().getName());
} }
看结果
二 scheduleAtFixedRate ?
package com.aaa.threaddemo; import static java.util.concurrent.TimeUnit.NANOSECONDS; import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import javax.xml.crypto.Data; /*
* 一 newScheduledThreadPool 是个啥?
* 1 是一个线程池
* 2 可定时执行任务
* 3 核心线程数是固定的
* 4 非核心线程数 2147483647
*
*
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {
return new ScheduledThreadPoolExecutor(corePoolSize);
} public ScheduledThreadPoolExecutor(int corePoolSize) {
super(
corePoolSize,
Integer.MAX_VALUE,
0, //非核心线程的生存时间是 0 马上回收。
NANOSECONDS,
new DelayedWorkQueue()); //一个优先级的队列 阻塞的队列,因为它实现了BlockingQueue } DelayedWorkQueue() 优先级队列怎么用的?
队列一般都是先进先出的,但是在定时/延时任务中,我们需要的是延迟时间短的任务先执行。
为了解决这个问题,需要用到一种特殊的队列
【优先级队列】
对插入的数据进行优先级的排序,保证优先级高的数据先执行。和往队列中插入的顺序无关。
没能深入调查。。。。 二 提供了两个方法可以用 schedule(command, delay, unit) schedule(
task, 需要执行的任务
3, 间隔的时间
TimeUnit.SECONDS 时间单位 秒 分 时 。。。
); scheduleAtFixedRate(
command,
initialDelay, 初次执行 间隔的时间
period, 再次执行的相隔时间
unit 时间的单位
)
【注意!】
如果只有一次间隔时间,线程结束后关闭线程池即可。 schedule(command, delay, unit)
但是当有二次间隔时间,是不能将线程池 shutdown的! scheduleAtFixedRate(command, initialDelay, period, unit) *
*/
public class ScheduledThreadPoolDemo {
public static void main(String[] args) {
SimpleDateFormat df2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //验证是否是在三秒后执行
System.out.println(df2.format(System.currentTimeMillis())); ExecutorService scheduledPool = Executors.newScheduledThreadPool(1); //创建定时的线程池 核心数量 2
ScheduledThreadDemo thread = new ScheduledThreadDemo(); Runnable task2 = new Runnable() {
public void run() {
System.out.println("开启任务 task2");
}
}; Runnable task3 = new Runnable() {
public void run() {
System.out.println("开启任务 task3");
}
}; ((ScheduledExecutorService) scheduledPool).schedule(thread,3,TimeUnit.SECONDS); //1.对于thread 2. 延迟时间3后执行任务 3.单位TimeUnit.SECONDS 是 【秒】 三秒后执行
((ScheduledExecutorService) scheduledPool).schedule(task2,5,TimeUnit.SECONDS); //延迟5秒后执行任务 ((ScheduledExecutorService) scheduledPool).scheduleAtFixedRate(task3, 8, 3, TimeUnit.SECONDS); //对于task3 程序启动 8秒后执行,中间间隔3秒执行一次。 // scheduledPool.shutdown();
}
} class ScheduledThreadDemo extends Thread{
@Override
public void run() {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(df.format(System.currentTimeMillis()));
System.out.println("我是线程1, 我在运行");
System.out.println("正在运行的线程名字" + Thread.currentThread().getName());
} }
查看结果
常见线程池 newScheduledThreadPool 定时执行任务的线程池 简单介绍的更多相关文章
- 9、java5线程池之定时任务线程池newScheduledThreadPool与newSingleThreadScheduledExecutor
JDK文档描述 newSingleThreadScheduledExecutor() 创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行.(注意,如果因为在关闭前的执行期间出现失败而终 ...
- 常见线程池之 newCacheThreadPool 缓存线程池 简单使用
package com.aaa.threaddemo; import java.util.concurrent.BlockingQueue; import java.util.concurrent.E ...
- java多线程系类:JUC线程池:01之线程池架构
概要 前面分别介绍了"Java多线程基础"."JUC原子类"和"JUC锁".本章介绍JUC的最后一部分的内容--线程池.内容包括:线程池架构 ...
- 这么说吧,java线程池的实现原理其实很简单
好处 : 线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配.调优和监控,有以下好处: 1.降低资源消耗: 2.提高响应速度: 3.提高线 ...
- 线程池系列一:线程池作用及Executors方法讲解
线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数量 ...
- python基础-12 多线程queue 线程交互event 线程锁 自定义线程池 进程 进程锁 进程池 进程交互数据资源共享
Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...
- Android线程管理之ThreadPoolExecutor自定义线程池
前言: 上篇主要介绍了使用线程池的好处以及ExecutorService接口,然后学习了通过Executors工厂类生成满足不同需求的简单线程池,但是有时候我们需要相对复杂的线程池的时候就需要我们自己 ...
- java多线程系类:JUC线程池:03之线程池原理(二)(转)
概要 在前面一章"Java多线程系列--"JUC线程池"02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包 ...
- 从源码解读线程(Thread)和线程池(ThreadPoolExecutor)的状态
线程是比进程更加轻量级的调度执行单位,理解线程是理解并发编程的不可或缺的一部分:而生产过程中不可能永远使用裸线程,需要线程池技术,线程池是管理和调度线程的资源池.因为前不久遇到了一个关于线程状态的问题 ...
随机推荐
- Codeforces 888C: K-Dominant Character(水题)
You are given a string s consisting of lowercase Latin letters. Character c is called k-dominant iff ...
- Blazor组件的new使用方式与动态弹窗
1. 前言 在Blazor中的无状态组件文中,我提到了无状态组件中,有人提到这个没有diff,在渲染复杂model时,性能可能会更差.确实,这一点确实是会存在的.以上文的方式来实现无状态组件,确实只要 ...
- Android开发 ListView(垂直滚动列表项视图)的简单使用
效果图: 使用方法: 1.在布局文件中加入ListView控件: <?xml version="1.0" encoding="utf-8"?> &l ...
- 初识python: 生成器并行(做包子,吃包子)
知识点: send(i) :唤醒yield,并将 i 的值传给 yield #!/user/bin env python # author:Simple-Sir # time:20181020 # 单 ...
- notepad++加到右键
win10系统左下角点击"开始"->运行->regedit,打开注册表编辑器 在HKEY_CLAsssEs_RooT→ * → shell 下,在shell下,新建项命 ...
- PowerShell 教程
随笔分类 - 教程 转载自:https://www.cnblogs.com/XiaoCY/category/1065141.html PowerShell 管道符之Where-Object的使用方法 ...
- Shell 中的 expect 命令
目录 expect 介绍 expect 安装 expect 语法 自动拷贝文件到远程主机 示例一 示例二 示例三 示例四 expect 介绍 借助 expect 处理交互的命令,可以将交互过程如 ss ...
- js监听网页页面滑动滚动事件,实现导航栏自动显示或隐藏
/** * 页面滑动滚动事件 * @param e *///0为隐藏,1为显示var s = 1;function scrollFunc(e) { // e存在就用e不存在就用windon.event ...
- 第10组 Beta冲刺 总结(组长)
1.基本情况 组长博客链接:https://www.cnblogs.com/cpandbb/p/14050808.html 答辩总结: ·因为alpha阶段的产品做得偏离了方向,所以beta冲刺大家非 ...
- Go语言系列之函数
函数是组织好的.可重复使用的.用于执行指定任务的代码块.本文介绍了Go语言中函数的相关内容. 函数 Go语言中支持函数.匿名函数和闭包,并且函数在Go语言中属于"一等公民". 函数 ...