线程池 java实现_Java线程池的实现

importjava.util.LinkedList;importjava.util.List;public classMyThreadPool {//线程池中默认线程的个数为5个

private static int worker_num = 5;//工作的线程

privateWorkThread[] workThreads;//未处理的任务

private static volatile int finished_task = 0;//任务队列,作为一个缓冲,List线程不安全所以需要在使用的过程中对它进行同步。

private List taskQueue = new LinkedList();//单例模式

private staticMyThreadPool threadPool;//私有化构造方法

privateMyThreadPool(){this(5);

}//创建线程池,num为线程池工作线程的个数

private MyThreadPool(intnum) {

MyThreadPool.worker_num=num;

workThreads= newWorkThread[num];for (int i = 0; i < num; i++) {

workThreads[i]= newWorkThread();

workThreads[i].start();

}

}//获得一个线程池,默认线程数

public staticMyThreadPool getThreadPool(){returngetThreadPool(MyThreadPool.worker_num);

}//单例模式,获得一个线程池

public static MyThreadPool getThreadPool(intnum) {if(num <= 0){

num=MyThreadPool.worker_num;

}if(threadPool == null){synchronized(MyThreadPool.class){if(threadPool == null)

threadPool= newMyThreadPool(num);

}

}returnthreadPool;

}/*** 执行任务

* 将该任务加入到任务队列的末尾,等待工作线程的调度

*@paramtask*/

public voidexecute(Runnable task){synchronized(taskQueue){

taskQueue.add(task);

taskQueue.notify();

}

}/*** 批量执行任务

* 将任务放到任务队列的末尾,等待工作线程的调度

*@paramtask*/

public voidexecute(Runnable[] task){synchronized(taskQueue){for(Runnable runnable : task) {

taskQueue.add(runnable);

}

taskQueue.notify();

}

}/*** 批量执行任务

* 将任务放到任务队列的末尾,等待工作线程的调度

*@paramtask*/

public void execute(Listtask){synchronized(taskQueue){for(Runnable runnable : task) {

taskQueue.add(runnable);

}

taskQueue.notify();

}

}/*** 销毁线程池

* 在所有任务都完成的情况下才销毁所有线程,否则等待任务队列的任务全部完成才销毁*/

public voiddestroy(){while(!taskQueue.isEmpty()){//如果还有任务没执行完成,就等会再看看

try{

Thread.sleep(10);

}catch(InterruptedException e) {

e.printStackTrace();

}

}//工作线程停止工作,且置为null

for (int i = 0; i < MyThreadPool.worker_num; i++) {

workThreads[i].stopWorker();

workThreads[i]= null;

}

threadPool= null;

taskQueue.clear();

}//返回工作线程的个数

public intgetWorkThreadNumber() {returnworker_num;

}//返回已完成任务的个数

public intgetFinishedTaskNumber(){returnfinished_task;

}//返回任务队列的长度,即还没处理的任务个数

public intgetWaitTaskNumber(){returntaskQueue.size();

}//覆盖toString方法,返回线程池信息:工作线程个数和已完成任务个数

@OverridepublicString toString() {return "WorkThread number:" + worker_num + " finished task number:"

+ finished_task + " wait task number:" +getWaitTaskNumber();

}/*** 内部类,工作线程用来执行任务线程

*@authorliu

**/

private class WorkThread extendsThread{//该工作线程是否有效,用于自然结束该工作线程

private boolean isRunning = true;/** 工作线程的关键之处,如果任务队列不空,则取出任务执行,若任务队列空,则等待。直到任务队列有任务时才取出执行*/@Overridepublic voidrun() {

Runnable r= null;while( isRunning ){//队列为空

synchronized(taskQueue){while(isRunning &&taskQueue.isEmpty()){try{

taskQueue.wait(20);

}catch(InterruptedException e) {

e.printStackTrace();

}

}if(!taskQueue.isEmpty()){//取出任务

r = taskQueue.remove(0);

}

}if(r != null){

r.run();//完成的任务加一

finished_task += 1;

}

r= null;

}

}//停止工作,让该线程自然执行完run方法,自然结束

public voidstopWorker() {this.isRunning = false;

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您简单介绍一下Java线程池实现原理。 Java线程池是一种多线程处理的方式,它可以有效地控制线程的创建、销毁和复用。线程池中包含一个线程队列,用于存储等待执行的任务,以及一组可用的线程,用于处理这些任务。 线程池的核心原理是将线程的创建和销毁分离开来,通过重复利用已有的线程,避免了频繁创建和销毁线程所带来的性能开销。 在Java中,线程池实现主要依赖于以下三个核心组件: 1. 线程池管理器(ThreadPoolExecutor):负责管理线程池中的所有线程,包括线程的创建、销毁和调度等操作。 2. 线程池工厂(ThreadFactory):用于创建新的线程,可以自定义线程的名称、优先级、是否为守护线程等属性。 3. 任务队列(BlockingQueue):用于存储等待执行的任务,包括有界队列(ArrayBlockingQueue)和无界队列(LinkedBlockingQueue)两种。 当我们向线程池中提交任务时,线程池会根据一定的策略从任务队列中选择一个任务,然后将其分配给线程池中的一个可用线程进行处理。如果线程池中没有可用的线程,那么任务会被暂时放入任务队列中等待处理。 当线程池中的线程完成任务后,它们并不会被立即销毁,而是将其返回到线程池中等待下一个任务的到来。这样,线程池就可以继续重复利用这些线程,避免了频繁创建和销毁线程所带来的性能开销。 希望以上内容对您有所帮助,谢谢!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值