本文为看视频学习笔记,若有错误请指正,谢谢!
原先如果要用到线程,需要在使用的时候new一个线程出来,并且不需要使用之后,还要销毁
new Thread(ticket,"1号窗口").start();
但是当任务数量较多的情况下,开发人员频繁的创建线程然后销毁线程的话,是非常耗费资源的,那么就有了线程池的概念。概念上与数据库连接池类似
线程池:提供了一个线程队列,队列中保存着等待状态的线程,只要有任务,线程就可以立马进行工作。这样子就避免了去创建与销毁线程的额外性能开销,提高了响应的速度
线程池的体系结构:
线程池也是在jdk1.5之后的java.util.concurrent包提供的,核心的接口是executor,线程的维护和调度的根接口
子接口:ExecutorService:线程池的主要接口
实现类:ThreadPoolExecutor
子接口:ScheduleExecutorService:负责线程的调度的接口
实现类:ScheduleThreadPoolService:继承了线程池的实现类ThreadPoolExecutor,又实现了ScheduleExecutorService接口,既具备线程池的功能又能调度线程
ExecutorService newSingleThreadExecutor():创建单个线程池,线程池中只有一个线程。
ScheduledExecutorService newScheduledThreadPool():创建固定大小的线程,可以延迟或者定时的执行任务
public class TestThreadPool {
public static void main(String[] args){
//创建线程池
ExecutorService pool = Executors.newFixedThreadPool(5);
ThreadPoolDemo threadPoolDemo = new ThreadPoolDemo();
//给线程池中的线程分配任务
for (int i = 0; i < 10; i++) {
pool.submit(threadPoolDemo);
}
//关闭线程池 shutdown(),shutdownNow()
pool.shutdown();
}
}
class ThreadPoolDemo implements Runnable{
private int num = 0;
@Override
public void run() {
while (num <= 100){
System.out.println(Thread.currentThread().getName()+":"+ num++);
}
}
}
以上是线程池中提交实现了Runnable的线程的写法,代码中涉及到了关闭线程池的方法shutdown()和shutdownNow()方法,其中,shutdown()方法是以一种平和的方式关闭线程池的,它会等待当前线程中线程执行完所有的任务之后才关闭线程池,期间如果有新的资源访问线程池,则不理会;而shutdownNow()则是立马关闭线程池,不论线程任务是否执行完毕。
线程池中提交继承了callable的线程的写法
public class TestThreadPool {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//创建线程池
ExecutorService pool = Executors.newFixedThreadPool(5);
List> list = new ArrayList<>();
//给线程池中的线程分配任务
for (int i = 0; i <10 ; i++) {
Future future = pool.submit(new Callable() {
@Override
public Integer call() throws Exception {
int sum = 0;
for (int j = 0; j <= 100 ; j++) {
sum += j;
}
return sum;
}
});
list.add(future);
}
//关闭线程池 shutdown(),shutdownNow()
pool.shutdown();
for (Future future:list) {
System.out.println(future.get());
}
}
}
运行结果:
线程调度:
public class TestThreadPool {
public static void main(String[] args) throws ExecutionException, InterruptedException {
//创建线程池
ScheduledExecutorService pool = Executors.newScheduledThreadPool(5);
//给线程池中的线程分配任务
for (int i = 0; i < 10; i++) {
Future future = pool.schedule(new Callable() {
@Override
public Integer call() throws Exception {
int num = (int)new Random().nextInt(100);
System.out.println(Thread.currentThread().getName() + ":" +num);
return num;
}
},1,TimeUnit.SECONDS);
System.out.println(future.get());
}
//关闭线程池 shutdown(),shutdownNow()
pool.shutdown();
}
对pool.schedule()这个方法的参数介绍,delay是long类型的数字,表明延迟的时间,unit是TimeUnit类型的数据,表明延迟时间的单位。
运行结果:间隔1秒输出