java.util.concurrent包(2)——线程池

简介:
一、概述
java.util.concurrent中有非常方便的线程池实现,提供的Executor框架包含用于管理实现Runnable任务,Executors类提供了许多不同类型的Executor实现的静态工厂方法。


二、实例
public class MyTask implements Runnable
{
public void run()
{
System.out.println(Thread.currentThread().getName() + "任务正在运行");
}
}

①固定大小线程池newFixedThreadPool
public class FixedThreadPoolTest
{
public static void main(String[] args)
{
// 创建固定大小为5的线程池
ExecutorService threadPool = Executors.newFixedThreadPool(5);
// 模拟执行了20个任务,而线程池中只有5个线程
for (int i = 0; i < 20; i++)
{
try
{
// 一次执行五个任务,其余任务排队
Thread.sleep(20);
threadPool.execute(new MyTask());
}
catch (Exception e)
{
e.printStackTrace();
}
}
threadPool.shutdown();
}
}
pool-1-thread-1任务正在运行
pool-1-thread-2任务正在运行
pool-1-thread-3任务正在运行
pool-1-thread-4任务正在运行
pool-1-thread-5任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-2任务正在运行
pool-1-thread-3任务正在运行
pool-1-thread-4任务正在运行
pool-1-thread-5任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-2任务正在运行
pool-1-thread-3任务正在运行
pool-1-thread-4任务正在运行
pool-1-thread-5任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-2任务正在运行
pool-1-thread-3任务正在运行
pool-1-thread-4任务正在运行
pool-1-thread-5任务正在运行

②不限制大小的线程池newCachedThreadPool
public class CachedThreadPool
{
public static void main(String[] args)
{
// 不限制线程池的大小
// 当以前创建的线程可以使用时会重新使用
ExecutorService threadPool = Executors.newCachedThreadPool();
for (int i = 0; i < 20; i++)
{
threadPool.execute(new MyTask());
}
threadPool.shutdown();
}
}
pool-1-thread-1任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-2任务正在运行
pool-1-thread-4任务正在运行
pool-1-thread-3任务正在运行
pool-1-thread-2任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-6任务正在运行
pool-1-thread-4任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-3任务正在运行
pool-1-thread-4任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-5任务正在运行
pool-1-thread-7任务正在运行
pool-1-thread-3任务正在运行
pool-1-thread-2任务正在运行
pool-1-thread-8任务正在运行
pool-1-thread-6任务正在运行


③单线程池newSingleThreadExecutor
public class SingleThreadPool
{
public static void main(String[] args)
{
// 单线程池
ExecutorService threadPool = Executors.newSingleThreadExecutor();
for (int i = 0; i < 20; i++)
{
threadPool.execute(new MyTask());
}
threadPool.shutdown();
}
}pool-1-thread-1任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-1任务正在运行
pool-1-thread-1任务正在运行

④定时任务线程池newScheduledThreadPool
public class ScheduledPool
{
public static void main(String[] args)
{
// 定时任务线程池
ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(3);
// 三秒后运行任务
threadPool.schedule(new MyTask(), 3, TimeUnit.SECONDS);
// 五秒钟后运行,每隔两秒钟执行一次
threadPool.scheduleAtFixedRate(new MyTask(), 5, 2, TimeUnit.SECONDS);
}
}
目录
相关文章
|
4月前
|
设计模式 Java 编译器
Java中的线程池你了解多少?
Java中的线程池你了解多少?
34 0
|
9月前
|
存储 缓存 资源调度
Java 线程池详解
Java 线程池详解
80 0
|
存储 缓存 安全
JUC:java.util.concurrent理解与使用示例
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。
375 0
JUC:java.util.concurrent理解与使用示例
|
算法 Java 调度
21.3 Java 线程池
线程是在一个进程中可以执行一系列指令的执行环境,或称运行程序。多线程编程指的是用多个线程并行执行多个任务。当然,JVM 对多线程有良好的支持。 尽管这带来了诸多优势,首当其冲的就是程序性能提高,但多线程编程也有缺点 —— 增加了代码复杂度、同步问题、非预期结果和增加创建线程的开销。这次,我们来了解一下如何使用 Java 线程池来缓解这些问题。 为什么使用线程池? 创建并开启一个线程开销很大。如果我们每次需要执行任务时重复这个步骤,那将会是一笔巨大的性能开销,这也是我们希望通过多线程解决的问题。 为了更好理解创建和开启一个线程的开销,让我们来看一看 JVM 在后台做了哪些事: 为线程栈分
99 0
|
Java
java 常用线程池介绍
java 常用线程池介绍
116 0
java 常用线程池介绍
Java java.util.concurrent.Future的一个例子
Java java.util.concurrent.Future的一个例子
198 0
|
Java
java.util.concurrent解析——AbstractQueuedSynchronizer队列管理
上一篇博客中,我们提到`AQS`的队列管理是基于CLH锁队列实现的,所以首先我们来看下`CLH锁队列`。
1288 0