一、定时器
1 概述
- 定时器是一种控制任务延时调用,或者周期调用的技术
- 作用:闹钟、定时邮件发送
- 实现方式:1 Timer 2 ScheduledExecutorService
2 Timer定时器
/**
目标:Timer定时器的使用和了解
*/
public class TimerDemo1 {
public static void main(String[] args) {
//1、创建Timer定时器
Timer timer=new Timer(); //定时器本身就是一个单线程
//2、调用方法,处理定时任务
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"执行一次~~~");
}
},3000,2000);
}
}
3 Timer定时器的特点和存在的问题
-
Timer是单线程,处理多个任务按照顺序执行,存在延时与设置定时器的时间有出入
-
可能因为其中的某个任务的异常使Timer线程死掉,从而影响后续任务执行
public class TimerDemo1 {
public static void main(String[] args) {
//1、创建Timer定时器
Timer timer=new Timer(); //定时器本身就是一个单线程
//2、调用方法,处理定时任务
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"执行一次AAA~~~"+new Date());
try {
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}
}
},0,2000);
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"执行一次BBB~~~"+new Date());
}
},0,2000);
}
}
4 ScheduledExecutorService定时器
ScheduledExecutorService是 jdk1.5中引入了并发包,目的是为了弥补Timer的缺陷, ScheduledExecutorService内部为线程池。
public class TimerDemo2 {
public static void main(String[] args) {
//1、创建ScheduledExecutorService线程池,做定时器
ScheduledExecutorService pool= Executors.newScheduledThreadPool(3);
//2、开启定时任务
pool.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"执行输出:AAA ==>"+new Date());
try {
Thread.sleep(5000);
} catch (Exception e) {
e.printStackTrace();
}
}
},0,2, TimeUnit.SECONDS);
pool.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"执行输出:BBB ==>"+new Date());
}
},0,2, TimeUnit.SECONDS);
}
}
二、并发、并行
正在运行的程序就是一个独立的进程,线程是属于进程的,多个线程其实是并发与并行同时进行的。
并发:1 CPU同时处理吸纳成的数量有限 2 CPU会轮询为系统的每线程服务,由于CPU切换速度很快,给我们的感觉这些线程在同时执行,这就是并发
并行:在同一个时刻上,同时有多个线程在被CPU处理并执行
三、线程的声明周期
- Java线程共有6种状态,都定义在Thread类的内部枚举类中