a2203476 2020-02-25 22:33 采纳率: 0%
浏览 235

关于JAVA线程池的一个问题,求解答~

我想实现一个这样的效果:
线程里面,各自带一个阻塞队列,拿到元素则处理。
然后把几个线程放进线程池里。想利用线程池控制最大可同时执行的线程数,线程池内的线程在不超过同时执行数限制的情况下,各自抢占式执行消费自己的队列,有什么办法可以实现吗?
试过了
newFixedThreadPool,
newWorkStealingPool,
newCachedThreadPool
都不能满足,因为提交的线程都有while(true),永远不会执行完,而被自身的队列阻塞时,线程池似乎也不会腾出资源执行别的队列非空线程,不知有没什么办法可以实现,求教~~

尝试的实例代码如下:
public static void main(String[] args) throws InterruptedException {
Thread001 t1 = new Thread001();
Thread001 t2 = new Thread001();
Thread001 t3 = new Thread001();
Thread001 t4 = new Thread001();
ExecutorService obj = Executors.newFixedThreadPool(3);
obj.execute(t1);
obj.execute(t2);
obj.execute(t3);
obj.execute(t4);
t1.queue.add("t1");
t2.queue.add("t2");
t3.queue.add("t3");
t4.queue.add("t4");
Thread.sleep(2000);
t1.queue.add("t5");
Thread.sleep(10000);
}
----------------------------------------------------------------
public class Thread001 implements Runnable{

public LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<String>();
@Override
public void run() {
    while(true){
        String s;
        try {
            s = queue.take();
            System.out.println("T1:"+s);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

}

运行结果:
T1:t1
T1:t3
T1:t2
T1:t5

  • 写回答

1条回答 默认 最新

  • 老衲の少女心 2020-02-26 21:37
    关注

    我怎么没发现你启动线程了?

    评论

报告相同问题?

悬赏问题

  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多
  • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图