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;
}
}
}
}
}
}
分享到:
相关推荐
1. 初始化线程执行提交的任务 2. 任务执行不过来,放入工作队列 3. 任务过多,线程和队列均处理不过来,拒绝执行(本文中将抛出RejectedExecuti
1、为什么需要使用线程池 1.1 创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率。 记创建线程消耗时间T1,执行任务消耗时间T2,销毁线程消耗时间T3,如果T1+T3>T2,那说明开启一个...
线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池线程池...
阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池阻塞线程池...
1、初始化线程的 4 种方式 2、线程池的七大参数 1、线程池创建,准备好 core 数量的核心线程,准备接受任务 2、新的任务进来,用 core 准备好的空闲
1、简介2、运行机制二、CyclicBarrier结构图CyclicBarrier是一个同步的辅助类,允许一组线程相互之间等待,达到一个共同点,再继续执行。Cy
)IO密集型:读取文件,数据库连接,网络通讯, 线程数适当大一点,机器的Cpu核心数*2,混合型:尽量拆分,IO密集型>>计算密集型,拆分意义不大,IO密集型~
简单的线程池程序+中文文档 包结构: com.tangkai.threadpool --SimpleThread.java 工作线程 --TestThreadPool.java 程序入口 --ThreadPoolManager.java 线程池管理类
1、先判断线程池中核心线程池所有的线程是否都在执行任务 2、判断当前阻塞队列是否已满,如果未满,则将提交的任务放 3、判断线程池中所有的线程是否都在执行任务,如
VC实现线程池
1:必须明白为什么要使用线程池:(这点很重要) a:手上项目所需,因为项目主要的目的是实现多线程的数据推送;需要创建多线程的话,那就要处理好线程安全的问题;因为项目需要,还涉及到排队下载的功能,所以就...
1. 创建线程池:使用ThreadPoolExecutor类创建线程池,设置线程池的核心线程数、最大线程数和keepAliveTime等参数。 2. 提交任务:将任务提交给线程池,线程池会自动选择空闲线程执行任务。 3. 监控线程池:使用...
1.事件对象的使用:http://baike.baidu.com/view/751499.htm。2.信号量的使用:http://baike.baidu.com/view/1285861.htm。3.等待单一对象,等待多个对象的使用:http://baike.baidu.com/view/1424795.htm,...
参考了ACE线程池机制实现的线程池,封装了工作者类CWorker,任务类CTask,线程调度类CManager,线程池类CThreadPool
线程池
以下示例显示如何使用线程池。首先创建 ManualResetEvent 对象,此对象使程序能够知道线程池何时运行完所有的工作项。接着,尝试向线程池添加一个线程。如果添加成功,则添加其余的线程(本例中为 4 个)。然后...
线程池模板 (可以让你快速地使用线程池技术) 帮助你学习线程池
JAVA线程池原理以及几种线程池类型介绍
Quartz 线程池 中剥离出来的代码 不例子
linux 线程池linux 线程池linux 线程池linux 线程池linux 线程池linux 线程池linux 线程池linux 线程池linux 线程池linux 线程池linux 线程池linux 线程池