为什么用线程池呢?
这个问题很容易理解。池者,容器也。线程池把设置到池中的线程管理起来。提高了系统的稳定性和线程的可控性。下面是本人写的一个线程小例子,通过Timer来反应线程池的机制。
package phl;
import java.io.Serializable;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
* phl 2010-4-24
* 这段程序演示了线程池 和定时线程的作用关系
* 本例中,线程池只允许一个线程执行,其他线程将加到队列中等待执行.
*
*/
public class Timer_ThreadPoolExecutor {
/**
ThreadPoolExecutor(
int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
RejectedExecutionHandler handler)
corePoolSize: 线程池维护线程的最少数量
maximumPoolSize:线程池维护线程的最大数量
keepAliveTime:线程池维护线程所允许的空闲时间
unit: 线程池维护线程所允许的空闲时间的单位
workQueue:线程池所使用的缓冲队列
handler: 线程池对拒绝任务的处理策略
*/
//方法一:不推荐
private static ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
1,
1,
3,
TimeUnit.SECONDS,
new ArrayBlockingQueue<Runnable>(3),
new ThreadPoolExecutor.DiscardOldestPolicy());
//方法二:推荐使用这种方法
private ExecutorService threadPool2 = Executors.newFixedThreadPool(5);
public static void main(String[] args) throws Exception {
Timer timer1 = new Timer();
TimerTask task1 = new TimerTask() {
public void run() {
threadPool.execute(new ThreadTask("11111 timer1"));
}
};
timer1.schedule(task1, 0, 1000 * 5);
Timer timer2 = new Timer();
TimerTask task2 = new TimerTask() {
public void run() {
threadPool.execute(new ThreadTask("22222 timer2"));
}
};
timer2.schedule(task2, 0, 1000 * 5);
}
}
class ThreadTask implements Runnable, Serializable {
private String name = "";
public ThreadTask(String name) {
this.name = name;
}
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println(name + " is running!");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
分享到:
相关推荐
在Delphi编程环境中,线程池是一种非常重要的...通过深入学习和实践这个`Delphi mcpage 线程池用法实例`,开发者可以更好地理解和掌握线程池的原理和实际操作,从而在自己的项目中有效利用多线程技术,提升软件性能。
接下来,我们将详细探讨这四大线程池的特点、用法及适用场景。 1. **固定大小线程池(newFixedThreadPool)** - 创建方法:`Executors.newFixedThreadPool(int nThreads)` - 特点:线程池大小固定,当所有工作...
本篇文章将重点探讨两种线程池实现:精易模块线程池和鱼刺模块线程池,并通过源码分析来展示它们的特点和用法。 首先,精易模块(SanYe Module)是由中国程序员SanYe开发的一系列开源模块,其中包含了线程池的实现...
按先后顺序执行线程 public static void main(String[] args) { ExecutorService t = Executors.newSingleThreadExecutor(); for (int i = 0; i ; i++) { t.submit(new AA(i));... System.out.println(...
浅谈Spring @Async异步线程池用法总结 本文主要介绍了Spring @Async异步线程池的用法总结,包括异步线程池的接口类、@Async定义异步任务、Spring开启异步配置等内容。 1. 异步线程池的接口类 Spring提供了多种...
Java线程池用法实战案例分析 Java线程池是Java并发编程中的一种重要机制,用于管理和执行多个线程,以提高程序的并发性和性能。在本文中,我们将通过实战案例来剖析Java线程池的用法,包括线程池的创建、使用和终止...
关闭线程池可以使用shutdown()或shutdownNow()方法。shutdown()方法将等待所有任务执行完毕后销毁线程,而shutdownNow()方法将立即结束所有线程,不管是否正在运行,并返回未执行完毕的任务列表。 使用java线程池时...
本篇文章将详细探讨Qt线程池的使用以及如何实现多线程间的通信。 首先,让我们了解什么是Qt线程池。Qt中的线程池由`QThreadPool`类实现,它可以管理一组线程,并根据需要分配任务。当一个任务被提交到线程池时,...
在VS2013环境下,结合控制台窗口,我们可以轻松地实现线程池的使用。下面将详细探讨C#线程池的工作原理、优势以及如何在实际项目中应用。 线程池的基本概念: 线程池是一组预先创建的线程,这些线程由操作系统维护...
在本示例"C#线程池使用demo"中,我们将探讨如何利用线程池来执行任务,以及其背后的原理和最佳实践。 首先,线程池主要由System.Threading命名空间下的ThreadPool类提供。在C#中,我们可以通过以下方式向线程池提交...
当不再需要线程池时,应通过`ExecutorService`的`shutdown()`方法优雅地关闭线程池。这个方法不会立即终止所有线程,而是不再接受新任务,待当前任务完成后,线程池才会关闭。如果希望立即停止所有任务,可以使用`...
在C++编程中,线程池是一种管理线程的有效机制,它可以提高程序的并发性能,减少线程创建和销毁的开销。线程池的概念基于池化资源的思想,即预先创建一组线程,当需要执行任务时,从池中获取空闲线程,而不是每次都...
1. Executor:它是Java中线程池的顶级接口,定义了执行线程的抽象方法,但它本身并不直接提供线程池功能。 2. ExecutorService:是真正的线程池接口,提供了一系列方法来管理线程的生命周期以及任务的执行。 3. ...
本文实例讲述了Python 线程池用法。分享给大家供大家参考,具体如下: # -*- coding:utf-8 -*- #! python3 ''' Created on 2019-10-2 @author: Administrator ''' from concurrent.futures import ...
以下示例显示如何使用线程池。首先创建 ManualResetEvent 对象,此对象使程序能够知道线程池何时运行完所有的工作项。接着,尝试向线程池添加一个线程。如果添加成功,则添加其余的线程(本例中为 4 个)。然后...
此外,还可以使用其他方法,如 `ThreadPool.UnsafeQueueUserWorkItem` 或 `ThreadPool.BindHandle` 来实现特定的线程池功能。对于更复杂的并发控制,可以使用 `Task` 类和 `Task Parallel Library (TPL)`,这是 .NET...
例如,可以使用`scheduleAtFixedRate`或`scheduleWithFixedDelay`方法来实现定时任务。 4. `newSingleThreadExecutor`: 创建一个单线程的线程池,所有的任务都会按照提交的顺序在一个单独的工作线程中依次执行。...
`ThreadPool`类的构造函数可以初始化线程池,`addTask`方法用于添加任务,`run`方法调度并执行任务,而`shutdown`方法则用于关闭线程池并清理资源。 线程池的使用场景广泛,如在网络I/O、数据库操作、定时任务、...
线程池的关闭也很重要,使用`shutdown()`方法会停止接收新任务但会执行已提交的任务,而`shutdownNow()`则会尝试停止所有正在执行的任务。 在实际应用中,选择合适的线程池配置和优化是性能调优的关键。需要考虑的...
- **提交任务**:使用`ExecutorService`的`execute()`方法提交`Runnable`或`Callable`任务。 - **线程调度**:线程池会根据预设策略决定何时运行新任务,可能立即执行或等待其他任务完成。 - **关闭线程池**:...