创建多线程
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
使用线程池来实现多线程
前言
前面我们已经了解过创建多线程的三种方式,继承Thread类,实现Runnable、Callable接口,但是当我们面对经常创建、销毁线程的时候,会显得十分麻烦,并且对性能的影响也很大,所以就要使用线程池来实现多线程。
一、线程池的初衷
我们提前创建好多个线程,然后把它们放到线程池当中,使用的时候直接获取,使用完毕后再重新放入线程池中,这样能避免频繁创建和销毁线程,以此来实现重复利用。
二、创建线程池
1.线程池相关API
/*
* ExecutorService:真正的线程池接口,常见子类ExecutorService和Executors
* void execute(Runnable command):执行命令,没有返回值,一般用来执行Runnable
* <T>Future<T>submit(Callable<T>task):执行任务,有返回值,一般用来执行Callable
* void shutdown():关闭连接池
* Executor:工具类、线程池的工厂类,用于创建并返回不同类型的线程池
* Executors.newCachedThreadPool():创建一个可根据需要创建新线程的线程池
* Executors.newFixedThreadPool(n):创建一个可重用固定线程数的线程池
* Executors.newSingleThreadExecutor():创建一个只有一个线程的线程池
* Executors.newScheduledThreadPool():创建一个线程池,它可安排再给定延迟后运行明空或者定期地执行
*/
2.代码实现
代码如下:
class NumThread1 implements Runnable{
@Override
public void run() {
for (int i=0;i<=100;i++){
if (i % 2 ==0){
System.out.println(Thread.currentThread().getName() + ":" +i);
}
}
}
}
class NumThread2 implements Runnable{
@Override
public void run() {
for (int i=0;i<=100;i++){
if (i % 2 !=0){
System.out.println(Thread.currentThread().getName() + ":" +i);
}
}
}
}
public class ThreadPool {
public static void main(String[] args) {
ExecutorService service = Executors.newFixedThreadPool(10);
service.execute(new NumThread1());
service.execute(new NumThread2());
service.shutdown();
}
}
三、使用线程池的好处
-
提高响应速度(减少了创建新线程的时间)
-
降低了资源消耗(重复利用,不需要每次创建)
-
便于线程管理
-
corePoolSize:核心池的大小
-
maximumPoolSize:最大线程数
-
keepAliveTime:线程没有任务时最多保持多长时间后会终止