package interview.pool;
import java.util.ArrayList;
public class ThreadPool
{
// 线程池的大小
public static int NUM_THREAD = 3;
// 线程集合
private ArrayList<Worker> threads = new ArrayList<Worker>(NUM_THREAD);
private static final ThreadPool iNSTANCE = new ThreadPool();
public static ThreadPool getInstance()
{
return iNSTANCE;
}
/**
* 进行初始化工作
*/
private ThreadPool()
{
for (int i = 0; i < NUM_THREAD; i++)
{
Worker worker = new Worker();
threads.add(worker);
worker.start();
}
}
/**
* 执行任务
*/
public synchronized void execute(Task task)
{
// 取出一个不忙的线程进行处理
for (Worker worker : threads)
{
if (!worker.isBusy())
{
worker.setTask(task);
worker.setBusy(true);
return;
}
}
// 都忙的话,则新建一个并添加到池中
// Worker w = new Worker();
// w.setTask(task);
// w.setBusy(true);
// w.start();
// this.threads.add(w);
try
{
Thread.sleep(1000);
execute(task);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
/**
* 内部类:线程工作者
*/
private class Worker extends Thread
{
Task task = null;
private boolean busy = false;
public boolean isBusy()
{
return busy;
}
public void setBusy(boolean busy)
{
this.busy = busy;
}
public Task getTask()
{
return task;
}
public Worker()
{
}
public void setTask(Task task)
{
this.task = task;
}
public void run()
{
while (true)
{
if (task != null)
{
try
{
task.execute();
}// 任何情况,都会置为不忙状态
finally
{
busy = false;
task = null;
}
}
}
}
}
}
分享到:
相关推荐
【自定义Java线程池实现】 在Java编程中,线程池是一种高效管理线程资源的方式,可以提高系统的性能和响应速度。本篇将探讨如何模拟Java的JDK线程池执行流程,以理解其设计原理。核心知识点包括线程池的执行策略、...
1. 为什么要用线程池? 线程池的主要优点在于资源管理和任务调度。当系统中有大量短生命周期的任务时,使用线程池可以避免反复创建和销毁线程的开销。此外,线程池能提供更好的控制,如限制并发执行的任务数量,...
1、为什么需要使用线程池 1.1 创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率。 记创建线程消耗时间T1,执行任务消耗时间T2,销毁线程消耗时间T3,如果T1+T3>T2,那说明开启一个...
1. 适当的线程池大小:根据服务器硬件配置和业务特性,合理设定线程池的大小,避免过度消耗资源或处理请求不及时。 2. 请求队列设计:队列长度应足够大,以缓冲高峰期的请求,但也不能过大导致内存压力。 3. 异常...
阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池...
1、初始化线程的 4 种方式 2、线程池的七大参数 1、线程池创建,准备好 core 数量的核心线程,准备接受任务 2、新的任务进来,用 core 准备好的空闲
1. 缓存线程池:缓存线程池是Java中的一个特殊的线程池,它可以根据需要动态地创建和销毁线程。缓存线程池的大小没有限制,可以根据需要添加或删除线程。 ```java ExecutorService service = Executors....
1. 当有新的任务提交到线程池时,首先检查核心线程池中的线程是否都在执行任务。如果存在空闲的核心线程,那么新任务将被分配给一个空闲的核心线程。 2. 如果所有核心线程都在忙碌,线程池会检查阻塞队列...
1. 根据任务特性选择合适的线程池类型,如CPU密集型任务选择固定大小线程池,I/O密集型任务选择有界的线程池。 2. 设置合理的线程池参数,如核心线程数、最大线程数和队列大小,确保线程池既能高效利用资源,又能...
1. **任务的性质**:要根据任务的类型和执行特性来调整线程池的参数。例如,对于CPU密集型任务,线程数接近CPU核心数时效率最优;而对于IO密集型任务,线程数可以设置得更高。 2. **线程池的监控**:通过监控线程池...
1. **初始化线程池**:设置线程池的大小,根据系统资源和应用需求决定预先创建的线程数量。 2. **创建工作线程**:为线程池创建一组线程,并将它们设置为等待状态,等待任务队列中的任务。 3. **添加任务**:当有新...
一、要实现高效的线程池,可以考虑以下几点 二、实现线程池可以按照以下步骤进行 三、简单的C++线程池代码示例 四、 基于boost编写的源码库 - 线程池 4.1 基于boost编写的源码库地址 4.2 boost线程池的先进先出、...
1. 工作者类CWorker: CWorker是线程池中的工作单元,每个工作线程都是一个CWorker实例。它负责接收来自线程池的任务,并执行这些任务。工作者线程通常会等待在队列中获取任务,一旦有任务到来,就进行处理。...
简单的线程池程序+中文文档 包结构: com.tangkai.threadpool --SimpleThread.java 工作线程 --TestThreadPool.java 程序入口 --ThreadPoolManager.java 线程池管理类
1. 初始化线程池:调用`InitializeThreadpoolEnvironment`函数创建线程池环境。 2. 创建线程池工作项:使用`CreateThreadpoolWork`函数定义一个工作项,该工作项包含要执行的函数和其参数。 3. 提交工作项:调用`...
1. **合理设置线程池大小**:根据应用的并发需求和服务器资源,调整线程池大小,避免过度消耗系统资源或导致任务积压。 2. **使用合适的 Job 类型**:对于计算密集型任务,可以选择使用 StatefulJob,保证每次执行...
1. 初始化线程池,设置线程数量。 2. 提交任务到线程池,由线程池分配线程执行。 3. 线程池中的线程管理和调度。 4. 监控线程池状态,如运行中的线程数、等待的任务数等。 5. 结束线程池,释放相关资源。 其次,...
1. **线程数量**:线程池中应该有多少个线程,这通常取决于硬件环境(如处理器核心数)和任务特性。一般来说,线程数应略多于CPU核心数,以应对I/O密集型任务或任务间的上下文切换。 2. **任务队列**:线程池需要一...
1. 创建线程池:根据需求设置线程池的参数,如最小线程数、最大线程数、核心线程存活时间等。 2. 提交任务:将任务提交到工作队列,等待被工作线程取走执行。 3. 执行任务:工作线程从队列中取出任务,执行完毕后...
1. **FixedThreadPool**:创建一个固定大小的线程池,线程数量由用户指定。当所有线程都在执行任务时,新提交的任务会被放入队列中等待执行。 2. **CachedThreadPool**:创建一个可根据需要创建新线程的线程池,但在...