0
点赞
收藏
分享

微信扫一扫

java并发编程(9)-- 线程池 创建 参数

柠檬的那个酸_2333 2022-03-30 阅读 95


java并发编程(9)-- 线程池 创建 参数_多线程


一、线程池基本概念

概念:

线程池主要是控制运⾏线程的数量,将待处理任务放到等待队列,然后创建线程执⾏这些任务。

如果超过了最⼤线程数,则等待。


为什么⽤线程池?

10年前单核CPU电脑,假的多线程,像⻢戏团⼩丑玩多个球,CPU需要来回切换。

现在是多核电脑,多个线程各⾃跑在独⽴的CPU上,不⽤切换效率⾼。


线程池的优点:

  • 线程池做的⼯作只要是控制运⾏的线程数量,
  • 处理过程中将任务放⼊队列,然后在线程创建后启动这些 任务,
  • 如果线程数量超过了最⼤数量,超出数量的线程排队等候,等其他线程执⾏完毕,再从队列中取 出任务来执⾏。


线程池的主要特点为:

线程复⽤;控制最⼤并发数;管理线程。

1. 线程复⽤:不⽤⼀直new新线程,重复利⽤已经创建的线程来降低线程的创建和销毁开销,节省系 统资源。

2. 提⾼响应速度:当任务达到时,不⽤创建新的线程,直接利⽤线程池的线程。

3. 管理线程:可以控制最⼤并发数,控制线程的创建等。


体系:

Executor → ExecutorService → AbstractExecutorService → ThreadPoolExecutor 。

Thr eadPoolExecutor 是线程池创建的核⼼类。类似 Arrays 、 Collections ⼯具类, Executor 也有⾃⼰的⼯具类 Executors 。



二、线程池三种常⽤创建⽅式

Java中的线程池是通过Executor框架实现的,该框架中⽤到了Executor,Executors, ExecutorService,ThreadPoolExecutor这⼏个类。

java并发编程(9)-- 线程池 创建 参数_多线程_02


newFixedThreadPool线程池

使⽤LinkedBlockingQueue 实现,定⻓线程池。

特点:执⾏⻓期任务性能好,创建⼀个线程池,⼀池有N个固定的线程,有固定线程数的线程

java并发编程(9)-- 线程池 创建 参数_多线程_03


newSingleThreadExecutor线程池

使⽤ LinkedBlockingQueue 实现,⼀池只有⼀个线程。

特点:⼀个任务⼀个任务的执⾏,⼀池⼀线程

java并发编程(9)-- 线程池 创建 参数_多线程_04



newCachedThreadPool线程池

使⽤ SynchronousQueue 实现,变⻓线程池。

特点:

执⾏很多短期异步任务,线程池根据需要创建新线程,但在先前构建的线程可⽤时将重⽤他们。

可扩容,遇强则强


java并发编程(9)-- 线程池 创建 参数_java_05


三、线程池代码演示

java并发编程(9)-- 线程池 创建 参数_线程池_06


package thread;

import java.util.concurrent.*;

/**
* 线程池代码演示
*/
public class ThreadPoolDemo {

public static void main(String[] args) {

//System.out.println("=======Fixed Thread Pool========");

// // ⼀个池⼦有5个⼯作线程,类似银⾏有5个受理窗⼝
//threadPoolTask( Executors.newFixedThreadPool(5) );



//System.out.println("======Single Thread Pool=========");

// // ⼀个池⼦有1个⼯作线程,类似银⾏有1个受理窗⼝
// threadPoolTask( Executors.newSingleThreadExecutor() );


// System.out.println("=====Cached Thread Pool=======");

// // 不定量线程,⼀个池⼦有N个⼯作线程,类似银⾏有N个受理窗⼝
// threadPoolTask( Executors.newCachedThreadPool() );



System.out.println(" =====Custom Thread Pool=======");

threadPoolTask(new ThreadPoolExecutor(
2,
5,
1L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.CallerRunsPolicy()
));

}

private static void threadPoolTask(ExecutorService threadPool) {

//模拟有10个顾客来办理业务
try {

for (int i = 1; i <= 10; i++) {

threadPool.execute(() -> {

System.out.println(Thread.currentThread().getName() + "\t办理业务");

});
}

} catch (Exception e) {
e.printStackTrace();
} finally {

threadPool.shutdown();
}

}

}

java并发编程(9)-- 线程池 创建 参数_多线程_07


四、线程池创建的七个参数

java并发编程(9)-- 线程池 创建 参数_线程池_08


java并发编程(9)-- 线程池 创建 参数_java_09


















举报

相关推荐

0 条评论