提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 线程池
- 定时器
一、线程池
作用:节约线程,不用每次需要使用线程就去创建,在代码中使用线程池显得更高级优雅
创建方式:用 ExecutorService或者用Executors,建议用ExecutorService,原因:程序员更清楚规则,核心线程和最大线程数量,数列等都可以自己自由设置。 用Executors创建的方法不适合大型项目中,初学建议用ExecutorService 创建线程这样更熟悉规则,小型代码也可以使用 Executors创建线程,因为方便。
ExecutorService创建线程池:
ExecutorService pool = new ThreadPoolExecutor(3, 5 ,
6, TimeUnit.SECONDS, new ArrayBlockingQueue<>(5) , Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy() );
Executors创建线程池(底层也是用的ExecutorService):
// 1、创建固定线程数据的线程池
ExecutorService pool = Executors.newFixedThreadPool(3);
提示:以下是本篇文章正文内容,下面案例可供参考
定时器
作用:定时执行某个任务,在项目经常用
两种创建方式:
用 ,代码简单,由于是单线程,一个线程出现异常或者时间过长,会影响其他的线程。
Timer timer = new Timer(); // 定时器本身就是一个单线程。
// 2、调用方法,处理定时任务
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "执行AAA~~~" + new Date());
}
}, 0, 2000);
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "执行BB~~~"+ new Date());
}
}, 0, 2000);
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "执行CCC~~~"+ new Date());
}
}, 0, 3000);
用线程池创建,代码比较麻烦,但是由于是多线程,一个线程因为异常跑崩不会影响其他的线程。
// 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(100000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, 0, 2, TimeUnit.SECONDS);
pool.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "执行输出:BBB ==》 " + new Date());
System.out.println(10 / 0);
}
}, 0, 2, TimeUnit.SECONDS);
pool.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + "执行输出:CCC ==》 " + new Date());
}
}, 0, 2, TimeUnit.SECONDS);
}