
今天我们来大概写一写最后一种创建多线程的方式,也是我们开发中最常用的方式,对于线程池这一块知识点很多,本博客大概写一写线程池的使用,暂时不会深入!
1.背景:经常创建和销毁、使用最特别大的资源,比如并发情况下的线程,
对性能影响很大。
2.思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毀、实现重复利用。类似生活中的公共交通工具。
3.好处:
JDK 5.0起提供了线程池相关 APl : ExecutorService 和 Executors
ExecutorService :真正的线程池接口。常见子类 ThreadPoolExecutor。
Executors :工具类、线程池的工厂类,用于创建并返回不同类型的线程池。
package 多线程;
import java.util.concurrent.*;
public class ThreadPool {
public static void main(String[] args){
// 1.提供指定线程数量的线程池
ExecutorService service = Executors.newFixedThreadPool(10);
// 2.执行指定的线程的操作,需要提供Runnable接口或者Callable接口实现类的对象
service.execute(new MyRun()); //execute适用于Runnable
Future f = service.submit(new MyCall()); //submit是用于Callable
try {
Integer sum = (Integer)f.get(); // 获取call()的返回值
System.out.println(Thread.currentThread().getName() + ":" + sum);
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
// 3.关闭连接池
service.shutdown();
}
}
// 实现Runnable接口
class MyRun implements Runnable{
@Override
public void run() {
for (int i=1;i<=10;i++){
System.out.println(Thread.currentThread().getName() + ":" + i);
}
}
}
// 实现Callable接口
class MyCall implements Callable {
@Override
public Object call() throws Exception {
int sum = 0;
for (int i=1;i<=10;i++){
sum += i;
System.out.println(Thread.currentThread().getName() + ":" + i);
}
return sum;
}
}

如果你觉得博主写的还不错的话,可以关注一下当前专栏,博主会更完这个系列的哦!也欢迎订阅博主的其他好的专栏。
🏰系列专栏
👉软磨 css
👉硬泡 javascript
👉flask框架快速入门