一  定时任务

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 定时执行任务的线程池 简单介绍的更多相关文章

  1. 9、java5线程池之定时任务线程池newScheduledThreadPool与newSingleThreadScheduledExecutor

    JDK文档描述 newSingleThreadScheduledExecutor() 创建一个单线程执行程序,它可安排在给定延迟后运行命令或者定期地执行.(注意,如果因为在关闭前的执行期间出现失败而终 ...

  2. 常见线程池之 newCacheThreadPool 缓存线程池 简单使用

    package com.aaa.threaddemo; import java.util.concurrent.BlockingQueue; import java.util.concurrent.E ...

  3. java多线程系类:JUC线程池:01之线程池架构

    概要 前面分别介绍了"Java多线程基础"."JUC原子类"和"JUC锁".本章介绍JUC的最后一部分的内容--线程池.内容包括:线程池架构 ...

  4. 这么说吧,java线程池的实现原理其实很简单

    好处 : 线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一分配.调优和监控,有以下好处: 1.降低资源消耗: 2.提高响应速度: 3.提高线 ...

  5. 线程池系列一:线程池作用及Executors方法讲解

    线程池的作用: 线程池作用就是限制系统中执行线程的数量.     根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数量 ...

  6. python基础-12 多线程queue 线程交互event 线程锁 自定义线程池 进程 进程锁 进程池 进程交互数据资源共享

    Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...

  7. Android线程管理之ThreadPoolExecutor自定义线程池

    前言: 上篇主要介绍了使用线程池的好处以及ExecutorService接口,然后学习了通过Executors工厂类生成满足不同需求的简单线程池,但是有时候我们需要相对复杂的线程池的时候就需要我们自己 ...

  8. java多线程系类:JUC线程池:03之线程池原理(二)(转)

    概要 在前面一章"Java多线程系列--"JUC线程池"02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明.内容包 ...

  9. 从源码解读线程(Thread)和线程池(ThreadPoolExecutor)的状态

    线程是比进程更加轻量级的调度执行单位,理解线程是理解并发编程的不可或缺的一部分:而生产过程中不可能永远使用裸线程,需要线程池技术,线程池是管理和调度线程的资源池.因为前不久遇到了一个关于线程状态的问题 ...

随机推荐

  1. LeetCode1240铺瓷砖

    题目 n*m的矩阵,只用正方形铺.求最少正方形个数. n,m<=13 思路 贪心: 加入是最大的正方形,显然行不通,比如n=11,m=13.那么贪心策略是1个11,其余是大小为2的正方形5个,大 ...

  2. 1052 - String Growth

    1052 - String Growth    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Z ...

  3. 1686 第K大区间

    1686 第K大区间 时间限制:1 秒 空间限制:131072 KB   定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. 众数(统计学/数学名词)_百度百 ...

  4. <数据结构>XDOJ327.最短路径

    问题与解答 问题描述 求图中任意两个顶点之间的最短路径. 输入格式 输入数据第一行是一个正整数,表示图中的顶点个数n(顶点将分别按0,1,-,n-1进行编号).之后的n行每行都包含n个整数,第i行第j ...

  5. 论文翻译:2020_ACOUSTIC ECHO CANCELLATION WITH THE DUAL-SIGNAL TRANSFORMATION LSTM NETWORK

    论文地址:https://ieeexplore.ieee.org/abstract/document/9413510 基于双信号变换LSTM网络的回声消除 摘要 本文将双信号变换LSTM网络(DTLN ...

  6. Vue-cli3.0配置全局less

    第一种配置方式(推荐) npm install style-resources-loader vue-cli-plugin-style-resources-loader less-loader les ...

  7. 年功序列c++游戏

    题目描述 在虚拟国度里多了很多 Virtual oier,为了树立对后辈的威信,从第 11 个 Virtual oier 开始的 oier 们搞起了年功序列的制度. 虚拟国度的创始人 oier Cht ...

  8. HiSql 实现case语法操作 新一代无实体ORM框架

    HiSql 实现case语法操作 在SqlServer,Oralce,Hana,PostGreSql,MySql 这些数据都支持SQL case语法,平常在实现业务开发中也会常用到,那么HiSql对于 ...

  9. 初识python 之 爬虫:爬取豆瓣电影最热评论

    主要用到lxml的etree解析网页代码,xpath获取HTML标签. 代码如下: 1 #!/user/bin env python 2 # author:Simple-Sir 3 # time:20 ...

  10. Selenium_使用execute_script执行JavaScript(11)

    selenium的包含的方法已能完全满足UI自动化,但是有些时候又不得不用到执行JS的情况,比如在一个富文本框中输入1W个字,使用send_keys方法将经历漫长的输入过程,如果换成使用JS的inne ...