目录
一.定时器
定时器是一种控制任务延时调用, 或者周期调用的技术
1.Timer定时器(不推荐)
2.ScheduledExecutorService定时器(推荐)
二.并发与并行
三.线程状态
一.定时器
定时器是一种控制任务延时调用, 或者周期调用的技术
1.Timer定时器(不推荐)
代码示范:
import java.util.Date; import java.util.Timer; import java.util.TimerTask; public class TimerDemo1 { public static void main(String[] args) { Timer time1 = new Timer();//定时器本身就是一个多线程 //schedule(TimerTask task,//任务 // long delay,//延时时间 // long period)//周期时间 time1.schedule(new TimerTask() { @Override public void run() { System.out.println(Thread.currentThread().getName()+"输出了..."+new Date()); } },2000,3000); Timer time2 = new Timer();//定时器本身就是一个多线程 time2.schedule(new TimerTask() { @Override public void run() { System.out.println(Thread.currentThread().getName()+"输出了:::"+new Date()); } },2000,3000); } }
结果展示:
Timer定时器的特点和存在的问题
(1) Timer是单线程,处理多个任务按照顺序执行,存在延时与设置定时器的时间有出入(2) 可能因为其中的某个任务的异常使Timer线程死掉,从而影响后续任务执行
2.ScheduledExecutorService定时器(推荐)
ScheduledExecutorService定时器的内部是线程池
代码示范:
import java.util.Date; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class Test1 { public static void main(String[] args) { ScheduledExecutorService pool = Executors.newScheduledThreadPool(3); //scheduleAtFixedRate(Runnable command,//任务 // long initialDelay,//延时时间 // long period,//周期时间 // TimeUnit unit)//延时时间和周期时间的单位 pool.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + "输出了???"+new Date()); } }, 3, 2, TimeUnit.SECONDS); pool.scheduleAtFixedRate(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + "输出了!!!"+new Date()); } }, 3, 2, TimeUnit.SECONDS); } }
结果展示:
优点: 基于线程池, 摸个任务的执行情况不会运行其他定时任务的执行
二.并发与并行
并发与并行
正在运行的程序(软件)就是一个独立的进程,线程是属于进程的,多个线程其实是并发与并行同时进行的
并发的理解:
CPU同时处理线程的数量有限
CPU会轮询为系统的每个线程服务,由于CPU切换的速度很快,给我们的感觉这些线程在同时执行,这就是并发并行的理解:
同一时刻同时在进行
三.线程状态
1.NEW(新建) 线程刚被创建,但是并未启动
2.Runnable(可运行) 线程已经调用了start()等待CPU调度
3.Blocked(锁阻塞) 线程在执行的时候未竞争到锁对象,则该线程进入Blocked状态
4.Waiting(无限等待) 一个线程进入Waiting状态,另一个线程调用notify或者notifyAll方法才能够唤醒
5.Timed Waiting(计时等待) 同waiting状态,有几个方法有超时参数,调用他们将进入Timed Waiting状态, 带有超时参数的常用方法有Thread.sleep 、object.wait
6.Teminated(被终止) 因为run方法正常退出而死亡,或者因为没有捕获的异常终止了run方法而死亡注意:调用sleep()方法不会让出锁对象, 但是调用wait()方法会让出锁对象