常见线程池 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)的状态
线程是比进程更加轻量级的调度执行单位,理解线程是理解并发编程的不可或缺的一部分:而生产过程中不可能永远使用裸线程,需要线程池技术,线程池是管理和调度线程的资源池.因为前不久遇到了一个关于线程状态的问题 ...
随机推荐
- CF 593B Anton and Lines(水题)
题意是给你n条直线,和x1,x2;问 在x1,x2之间(不包括在x1,x2上) 存不存在任意两条线的交点. 说思路,其实很简单,因为给的直线的条数很多,所以无法暴力求每两条直线的交点,那么就求每条直线 ...
- 1269 - Consecutive Sum
1269 - Consecutive Sum PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: 64 MB ...
- git 上传项目到远程仓库
电脑安装git客户端.注册github账号并登陆 到本地项目文件夹右键选择git bash here 输入个人信息(代码提交者) git config --global user.name " ...
- Generating Adversarial Examples with Adversarial Networks
目录 概 主要内容 black-box 拓展 Xiao C, Li B, Zhu J, et al. Generating Adversarial Examples with Adversarial ...
- vue项目报错如下:(Emitted value instead of an instance of Error)
(Emitted value instead of an instance of Error) the "scope" attribute for scoped slots hav ...
- spring练习,使用Eclipse搭建的Spring开发环境,使用set注入方式为Bean对象注入属性值并打印输出。
相关 知识 >>> 相关 练习 >>> 实现要求: 使用Eclipse搭建的Spring开发环境,使用set注入方式为Bean对象注入属性值并打印输出.要求如下: ...
- 射频FEM介绍
FEM介绍 1. 什么是FEM 1.1 FEM简介 FEM,Front-end Modules,即就是前端模块.硬件电路中的前端模块完成射频信号的发送放大以及接收放大(with bypass).滤波, ...
- docker学习:docker命令
帮助命令 自验证 docker version 详情信息 docker info 获取帮助 docker --help 镜像命令 列出本例主机上的镜像 docker images [OPTIONS] ...
- NoSQL是什么(一)
最常见的数据库可以分为下面的两种类型: RDBMS(关系型数据库):常见的关系型数据库有 Oracle.DB2.Microsoft SQL Server.Microsoft Access.MySQL: ...
- Chrome - XPath Helper插件 使用手工拖拽方式无法正常安装的解决办法
安装前准备: (1)下载 XPath Helper资源: 链接: https://pan.baidu.com/s/1yEnngIJz8fT9fNv3aHhs7w 提取码: afy3 (2)Chrome ...