【 java 多线程】创建多线程的方式四:使用线程池创建多线程
2023-09-27 14:26:52 时间
📋 个人简介
- 💖 作者简介:大家好,我是阿牛,全栈领域优质创作者。😜
- 📝 个人主页:馆主阿牛🔥
- 🎉 支持我:点赞👍+收藏⭐️+留言📝
- 📣 系列专栏:java 小白到高手的蜕变🍁
- 💬格言:要成为光,因为有怕黑的人!🔥
前言
今天我们来大概写一写最后一种创建多线程的方式,也是我们开发中最常用的方式,对于线程池这一块知识点很多,本博客大概写一写线程池的使用,暂时不会深入!
使用线程池的好处
1.背景:经常创建和销毁、使用最特别大的资源,比如并发情况下的线程,
对性能影响很大。
2.思路:提前创建好多个线程,放入线程池中,使用时直接获取,使用完放回池中。可以避免频繁创建销毀、实现重复利用。类似生活中的公共交通工具。
3.好处:
- 提高响应速度(减少了创建新线程的时间)
- 降低资源消耗(重复利用线程池中线程,不需要每次都创建)
- 便于线程管理
- corePoolSize:核心池的大小
- maxmumPoolSize:最大线程数
- keepAliveTime:线程没有任务时最多保持多长时间会终止
- …
线程池相关API
-
JDK 5.0起提供了线程池相关 APl : ExecutorService 和 Executors
-
ExecutorService :真正的线程池接口。常见子类 ThreadPoolExecutor。
- void execute ( Runnable command ):执行任务/命令,没有返回值,一般用来执行Runnable
- Future submit(Callable task):执行任务,有返回值,一般用来执行Callable
- void shutdown ():关闭连接池
-
Executors :工具类、线程池的工厂类,用于创建并返回不同类型的线程池。
- Executors.newCachedThreadPool ():创建一个可根据需要创建新线程的线程池
- Executors.newFixedThreadPool (n);创建一个可重用固定线程数的线程池
- Executors.newSingleThreadExecutor ():创建一个只有一个线程的线程池
- Executors.newScheduledThreadPool (n):创建一个线程池,它可安排在给定延迟后运行命令或者定期地执行。
线程池的使用步骤及案例
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框架快速入门
相关文章
- 【Java多线程】线程状态、线程池状态
- 多线程学习一,Java线程的处理方式
- Java的正则表达式原理及使用场景
- java基础---->多线程之ThreadLocal(七)
- java多线程之线程池
- java多线程之线程组与线程池
- java多线程关键字volatile的使用
- Java多线程之深入理解线程池
- Java多线程系列--阻塞队列(BlockingQueue)的用法(有实例)
- Java多线程:线程状态以及wait(), notify(), notifyAll()
- Java 多线程(五)—— 线程池基础 之 FutureTask源码解析
- java多线程:CopyOnWriteArrayList
- java多线程之Future模式使用
- Java多线程批量操作,居然有人不做事务控制?
- Java多线程,Thread,Runnable,Callable & Task,Future<Task>,CompletionService
- 【多线程】Java线程的创建
- Java多线程-新特性-线程池
- Java多线程-线程的同步(同步方法)
- Java多线程-线程的调度(优先级)
- Java多线程-线程的同步与锁
- Java多线程-线程的生命周期
- Java 多线程断点下载文件_详解