java线程池(线程池组---分离任务队列和线程池)

本文提出了一种改进线程池管理的方法,通过将线程池和任务队列分离,使用多个线程池组来均衡处理任务,从而解决高并发场景下任务堆积导致的性能瓶颈问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程池本质上所使用的逻辑模型仍然是我们熟悉的“生产者/消费者”模型。

                              生产            消费 
    外部线程(生产者)--->任务<---线程池线程(消费者)

消费者和生产者共享一个数据结构(缓存任务)PriorityQueue;生产者将任务添加到队列中,消费者从队列中取出数据;队列和线程池( 线程池内部维护一个线程数组),完全耦合在一起,当任务特别多,队列就不断的膨胀,增多,拥堵;就向车子过洞子 另外一头走不掉,我靠,长龙(世界最长堵车世界纪录在天朝 200多公里)

问题来了,试想这样的一个情景: 当大量登录的消息进来,出去的少(进入大于出去),队列就不断增加,线程忙不过来处理就空起了,那么大量的其他登录消息就进不来了;阻塞起了;

我的想法是这样解决,本身线程池不是万能的,能否将线程池和数据结构分离开来,外部用一个线程池组,每一个线程池开N个线程(注意应用场景来决定);

譬如之前我一个线程池是6个线程,

现在就是开6个线程池组,一个线程池对应一个线程,即一个线程==线程池;这样看对应的线程池和任务队列就分开了,相当于开6个线程,把任务均衡到6个队列中,相应的线程去消耗;这样就实现了线程池和任务队列的分离;这样效果是否和单独开一个线程池6个线程一样呢?答案你应该无法猜出来,本身这个就要根据实际情况去处理;这里只是提供一个想法而已 ;

以下就基于netty提供的线程池封装的一个线程池组,要用请导入netty,版本是4;

package Server.ExtComponents.utilsKit.ThreadUtils;

import io.netty.util.concurrent.DefaultEventExecutorGroup;
import io.netty.util.concurrent.EventExecutorGroup;
import org.apache.log4j.xml.DOMConfigurator;
import org.springframework.stereotype.Service;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author : 石头哥哥
 *         Project : LandlordsServer
 *         Date: 13-8-5
 *         Time: 下午7:37
 *         Connect: 13638363871@163.com
 *         packageName: Server.ExtComponents.utilsKit.ThreadUtils
 *         线程池组管理类
 *         多个线程池,平均处理的任务,并行处理;
 */
@Service
public class ThreadPoolExecutorGroupManager {

    private    EventExecutorGroup EventExecutor[];
    private  final AtomicInteger _index = new AtomicInteger();
    private static final int MAX_FLG=100;

    public ThreadPoolExecutorGroupManager(){

    }

    /**
     *    初始化线程组
     * @param poolArraySize
     */
    public  void  init(int poolArraySize){
        int DEFAULT_THREAD_CORE_SIZE = 1;
        init(poolArraySize, DEFAULT_THREAD_CORE_SIZE,ThreadPoolExecutorGroupManager.class+"");
    }


    /**
     * 初始化线程组
     * @param poolArraySize    线程组数量
     * @param threadCoreSize  每个线程池数量
     */
    public void init(int poolArraySize,int threadCoreSize,String groupNmae){
             EventExecutor=new EventExecutorGroup[poolArraySize];
             for (int i=0;i!=poolArraySize;++i){
                 EventExecutor[i]=new DefaultEventExecutorGroup(
                         threadCoreSize,
                         new PriorityThreadFactory(groupNmae+"+#+"+i, Thread.NORM_PRIORITY ));
             }
    }


    /**
     * 获取下一个线程池
     * @return   EventExecutorGroup
     */
    public   EventExecutorGroup nextThreadPool(){
        int index=_index.getAndIncrement();
        if (index>=MAX_FLG){_index.set(0);}
        return    EventExecutor[Math.abs(index)%EventExecutor.length];
    }


    public static void  main(String[]args){
        DOMConfigurator.configure("res/log4j.xml");
        ThreadPoolExecutorGroupManager executorGroupManager=new ThreadPoolExecutorGroupManager();
        executorGroupManager.init(2,3,"excutors");
        for (int i=0;i!=102;++i){
                System.out.println("-->>>>"+executorGroupManager.nextThreadPool());
        }
    }


}
package Server.ExtComponents.utilsKit.ThreadUtils;

import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author :陈磊 <br/>
 *         Project:CreazyGameServer1.3
 *         Date: 13-3-19
 *         Time: 下午8:47
 *         connectMethod:13638363871@163.com<br/>
 */
public class PriorityThreadFactory implements ThreadFactory {

    private int _prio;
    private String _name;
    private AtomicInteger _threadNumber = new AtomicInteger(1);
    private ThreadGroup _group;

    /**
     *
     * @param name 线程池名
     * @param priority   线程池优先级
     */
    public PriorityThreadFactory(String name, int priority){
        _prio = priority;
        _name = name;
        _group = new ThreadGroup(_name);
    }

    @Override
    public Thread newThread(Runnable r){
        Thread t = new Thread(_group, r);
        t.setName(_name + "-"+"#-" + _threadNumber.getAndIncrement());
        t.setPriority(_prio);
        return t;
    }

    public ThreadGroup getGroup(){
        return _group;
    }
}
好吧今天就到这。

转载于:https://my.oschina.net/chenleijava/blog/150321

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值