ThreadPoolExecutor添加线程不执行,为什么 5C

import com.google.common.util.concurrent.ThreadFactoryBuilder;

import java.util.concurrent.*;

public class MyBlockingQueue implements Runnable {

BlockingQueue<String> queue;

private int index;

public MyBlockingQueue(BlockingQueue<String> queue, int index) {
    this.queue = queue;
    this.index = index;
}

@Override
public void run() {
    try {
        queue.put(String.valueOf(this.index));
        System.out.println("{" + this.index + "} in queue!");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

public static void main(String args[]) {
    BlockingQueue<String> queue = new LinkedBlockingQueue<String>(3);

    ThreadFactory factory = new ThreadFactoryBuilder().setNameFormat("aaa-%s").build();
    ExecutorService pool = new ThreadPoolExecutor(5, 200, 0L, TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<>(1024), factory, new ThreadPoolExecutor.AbortPolicy());

    for (int i = 0; i < 10; i++) {
        pool.submit(new MyBlockingQueue(queue, i));
    }

  //为什么这里的线程不执行呢?
    pool.submit(() -> {
        try {
            while (true) {
                System.out.println("=======" + queue.size());
                if (queue.isEmpty()) {
                    break;
                }
                String str = queue.take();
                System.out.println(str + " has take!");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    });

    pool.shutdown();
}

}

1

1个回答

首先想说一下,其中的问题,阻塞队列和工厂模式OK,
在创建线程池的时候并不建议使用ExecutorService 中的构造函数,而是使用Executors里面提供的四种静态方法,很多的参数配置已经写好。

其次,给线程池submit的应该是线程,而不是阻塞队列,你那里submit的是阻塞队列噢,循环体里面你可以写一个自己的类
比如(class MyThread extends Thread),再写一个print,sleep一下,就可以看到线程池的执行啦。

https://blog.csdn.net/whandwho/article/details/82931798 这个博客下方第八点

1
whandwho
大川里的小川人 回复adongsha: 是我没有说清楚哇?最后的那一条,已经说清楚了嘛,有什么问题你再问嘛。
4 个月之前 回复
whandwho
大川里的小川人 回复adongsha: 我重新完整看了一遍你的代码。我帮你理一下你的思路,首先,你实现了runnable接口新建了一个线程类,线程类内部定义了index和一个string的阻塞队列。 其次,在main函数里面,你内部定义了一个String的阻塞队列,而针对线程池的阻塞队列,类型应该是线程类。 最后,你submit的是你自己定义的线程类,OK,然后你讲阻塞队列里面的取出来,取出来的是定义为String的阻塞队列内部内容。但是你实例化的是自己定义的实现runnable接口线程类MyBlockdeQuene.
4 个月之前 回复
whandwho
大川里的小川人 回复adongsha: 但是你submit的是队列,就算你这样是参考的阿里规范,按照你的意思,我submit的是阻塞队列,OK,没有问题。接着那么阻塞队列里面存放的应该是 Thread 线程,而不是 String。 所以就算你submit了一个队列,但是你队列里面存放的也不是线程Thread。
4 个月之前 回复
whandwho
大川里的小川人 接着那么阻塞队列里面存放的应该是 Thread 线程,而不是 String。
4 个月之前 回复
whandwho
大川里的小川人 回复adongsha: 但是你submit的是队列,就算你这样是参考的阿里规范,按照你的意思,我submit的是阻塞队列,OK,没有问题。
4 个月之前 回复
adongsha
adongsha 这种方式的写法是参考阿里java规范的写法,你提倡的那种写法,阿里规范是不建议的哦
4 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
ThreadPoolExecutor解析三(线程池执行提交任务)
Executor接口的定义:[url]http://donald-draper.iteye.com/blog/2365625[/url] ExecutorService接口定义:[url]http://donald-draper.iteye.com/blog/2365738[/url] Future接口定义:[url]http://donald-draper.iteye.com/blog/23...
ThreadPoolExecutor在一个确定的队列下提交任务,如果执行队列满必须阻塞的解决方法
ThreadPoolExecutor在一个确定的队列下提交任务,如果执行队列满必须阻塞的解决方法
ThreadPoolExecutor线程池任务执行失败的时候会怎样
  ThreadPoolExecutor线程池任务执行失败的时候会怎样   1.  任务执行失败时的处理逻辑 1.1.  Worker Worker相当于线程池中的线程 可以看到,Worker有几个重要的属性: thread : 这是Worker运行的线程,可以理解为一个Worker就是一个线程 firstTask : 初始任务,可能为为null completedTas...
使用ThreadPoolExecutor,当提交线程超过maximumPoolSize 会阻塞主线程吗?
今天领导说使用线程池,当提交的子线程超过运行的最大线程数,会阻塞主线程,然后我就回复 有拒绝策略,会抛出异常,同时也要确认当线程池满的时候executor.execute方法会不会是阻塞的了,其实内心是不认可这个观点的。不轻信别人,谨慎求证。
ThreadPoolExecutor 是如何做到线程重用的
前言: 看关于ThreadPoolExecutor参数时,看到了keepaliveTime这个参数,这个参数的意思是:“当线程数大于CorePoolSize时,如果有没有等到新的Task,到了keepaliveTime时间后,就自动终止掉”。那么如果在这个时间之前,等到了新的Task,就可以重用这个线程。到底是怎么重用线程的呢? 线程重用的核心是,我们知道,Thread.sta
ThreadPoolExecutor线程池的使用
大家先从ThreadPoolExecutor的总体流程入手:  针对ThreadPoolExecutor代码,我们来看下execute方法: [java] view plaincopy public void execute(Runnable command) {           if (command == null)
线程池ThreadPoolExecutor的实现原理?
原文地址:https://www.jianshu.com/p/ade771d2c9c0线程池有多重要#####线程是一个程序员一定会涉及到的一个概念,但是线程的创建和切换都是代价比较大的。所以,我们有没有一个好的方案能做到线程的复用呢?这就涉及到一个概念——线程池。合理的使用线程池能够带来3个很明显的好处:1.降低资源消耗:通过重用已经创建的线程来降低线程创建和销毁的消耗2.提高响应速度:任务到达...
ThreadPoolExecutor线程池参数设置技巧
一、ThreadPoolExecutor的重要参数   corePoolSize:核心线程数 核心线程会一直存活,及时没有任务需要执行当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭 queueCapacity:任务队列容量(阻塞队列) 当核心线程数达到
ThreadPoolExecutor最佳实践--如何选择线程数
去年的一篇《ThreadPoolExecutor详解》大致讲了ThreadPoolExecutor内部的代码实现。 总结一下,主要有以下四点: 当有任务提交的时候,会创建核心线程去执行任务; 当核心线程数达到corePoolSize时,后续提交的都会进BlockingQueue中排队; 当BlockingQueue满了(offer失败),就回创建临时线程; 当线程总数达到maximumPoo...
线程池+队列 优先级方式执行队列任务
通过jdk自带ThreadPoolExecutor线程池+队列 实现优先级方式执行线程任务
java线程池之ThreadPoolExecutor(三):提交任务并得到任务执行结果
1.Callable接口 ThreadPoolExecutor不仅可以执行Runnable的实现类,还可以执行Callable接口的实现类。Callable的接口和Runnable接口的区别是:Callable有一个call方法能够得到任务执行结果,而Runnable的run方法无法得到返回结果。Callable的接口的定义如下: public interface Callable {
使用ThreadPoolExecutor类创建线程池
一、采用这种方式的优点: 可以实时获取线程池内线程的各种状态 可以动态调整线程池大小 二、线程池的工作原理简介: 如果当前线程池中的线程数目小于corePoolSize,则每来一个任务,就会创建一个线程去执行这个任务; 如果当前线程池中的线程数目>=corePoolSize,则每来一个任务,会尝试将其添加到任务缓存队列当中,若添加成功,则该任务会等待空闲线程将其取出去执行;若添加失败(一般来说是任务
ThreadPoolExecutor,worker和线程工厂之间理解
ThreadPoolExecutor中一个线程就是一个Worker对象,它与一个线程绑定,当Worker执行完毕就是线程执行完毕,这个在后面详细讨论线程池中线程的运行方式。而Worker带了锁,根据我后面准备写的读写锁的例子,发现线程池是线程安全的。看看图二的类图。
Java中的线程池——ThreadPoolExecutor的原理
1 线程池的处理流程 向线程池提交一个任务后,它的主要处理流程如下图所示 一个线程从被提交(submit)到执行共经历以下流程: 线程池判断核心线程池里是的线程是否都在执行任务,如果不是,则创建一个新的工作线程来执行任务。如果核心线程池里的线程都在执行任务,则进入下一个流程线程池判断工作队列是否已满。如果工作队列没有满,则将新提交的任务储存在这个工作队列里。如果工作队列满了,则进入下
线程池ThreadPoolExecutor及常见的4种
https://blog.csdn.net/qq_23391049/article/details/80373511为什么用线程池创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处理效率例如:记创建线程消耗时间T1,执行任务消耗时间T2,销毁线程消耗时间T3如果T1+T3&amp;gt;T2,那么是不是说开启一个线程来执行这个任务太不划算了!正好,线程池缓存线程,可用已有的闲置线程...
线程池(ThreadPoolExecutor)源码分析之如何保证核心线程不被销毁的
今天看到了别人的一个代码,为了实现每小时重启一下MQ拉取消息,他使用的是Thread.sleep(1000*60*60)方法,然后重启MQ。我一看到就非常头疼啊。。为什么要使用这种方式而不使用java的线程池呢?于是我就问他,他说当时为了方便。大家都知道Thread.sleep期间是不会释放共享资源的,会造成死锁现象。然后我就想Thread.sleep可以在睡觉过程中等待被interrupt中断,然
线程的异常捕获与线程池的异常捕获 execute与submit区别
https://www.cnblogs.com/wscit/p/6100476.html#(单线程情况)对于单线程来说,只需要重写UncaughtException就好了,如下:123456789/** * Author: scw * Time: 16-11-24 */public class RewriteUncatchtExceptionHandler implements Thread.Un...
ThreadPoolExecutor是如何做到线程重用的
前言: 看关于ThreadPoolExecutor参数时,看到了keepaliveTime这个参数,这个参数的意思是:“当线程数大于CorePoolSize时,如果有没有等到新的Task,到了keepaliveTime时间后,就自动终止掉”。那么如果在这个时间之前,等到了新的Task,就可以重用这个线程。到底是怎么重用线程的呢? 正文:原理如下: 前提条件:假如coreSize=3,maxS
Java多线程之~~~使用ThreadPoolExecutor来创建线程
以前我们创建线程的时候都是主动的new一个Thread,然后调用他们的start方法,但是如果线程非常多,任务也非 常多的时候,这样写就会显得非常麻烦,当然可能效率也不是很高,Java给我们提供了叫线程创建器这个样概念的类, 他可以帮助我们管理这些线程,你做的就是编写好代码,然后交给他,她就会自动帮你运行。 当然,带cache的threadpool 对于死掉的线程重新调用,在性能上也会有非常
Java 线程池(ThreadPoolExecutor)原理分析与实际运用
一、使用线程池的好处 1、降低资源消耗 可以重复利用已创建的线程降低线程创建和销毁造成的消耗。 2、提高响应速度 当任务到达时,任务可以不需要等到线程创建就能立即执行。 3、提高线程的可管理性 线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控 二、线程池的工作原理 首先我们看下当一个新
python 多线程,详细教程,线程同步,线程加锁,ThreadPoolExecutor
python 多线程的使用多线程主要用于大量的IO操作时的并发执行,以此来提高效率!多进程主要用于大量的计算,进而充分发挥CPU的性能!这里主要讲述两种多线程的使用:threading.Threadconcurrent.futures.ThreadPoolExecutor使用第二种方式需要先安装(对于python2.x)pip install futures基本使用第一种方式的简单使用:(注意:空...
ThreadPoolExecutor中运行线程名称的修改
项目中使用到了ThreadPoolExecutor,这个是挺好的东西,线程池的实现。但有一点不太爽的是,用Jprofiler调试由它创建的线程的时候,看到的都是pool-1-thread-1\2\3\4之类的。这是它自身的默认规则产生的,pool代表这是池,-1-代表是第几个ThreadPoolExecutor产生的,-thread-1是递增的。 所以每次我都要点 Thread Dumps 去查
一心多用多线程-线程池ThreadPoolExecutor-看这篇就够了
许久之前理解了java线程池ThreadPoolExecutor,今天来做一个总结,根据java api加上自己的理解,让我们能更透彻的理解java线程池首先先写一下线程池的概念: 线程池:线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台线程。每个线程都使用默认的堆栈大小,以默认的优先级运行,并处于多线程单元中。如果某个线程在托管代码中空
线程池(ThreadPoolExecutor ) 的关闭与监控
本文导读 本文继续深入线程池理论部分,如关闭线程池,线程池统计等 参考文章:《线程池理论 之 线程池饱和策略 与 工作队列排队策略》、《线程池(ThreadPoolExecutor) 创建与使用》 关闭线程池 可以通过调用线程池的shutdown或shutdownNow方法来关闭线程池。 原理都是遍历线程池中的工作线程,然后逐个调用线程的interrupt方法来中断线程,所以无法响应中断的...
线程池execute/submit差异
参考:Java多线程-线程池ThreadPoolExecutor的submit返回值Future   1、无返回值:execute ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3); for (int i = 0; i &amp;lt; 30; i++) {     final int finalI = i;    ...
ThreadPoolExecutor线程池的深入理解
最近实验室很多同学也在开始内推和网申,也有很多同学已经开始面试了,至于线程池嘛,一直以来都是面试的重灾区,明明知道会被问道,但好多同学依然不能给予面试官满意的答案,所以在此我跟大家分享一下至关重要的线程池相关问题吧,希望大家都能够深入的理解掌握线程池这一重要的知识点吧~一、首先我们要知道究竟线程池是何方神物呢?         线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程...
【小家java】用 ThreadPoolExecutor/ThreadPoolTaskExecutor 线程池技术提高系统吞吐量(附带线程池参数详解和使用注意事项)
1、概述 很多人想问,线程池听起来高大上,但在实际工作中却很少使用。其实不然,在各种流行框架或者高性能的架构中,池化技术是无处不在的。所有有人就想问了,线程池有什么用呢? 一言以蔽之,就是提高系统效率。如果服务器对每个请求都分别创建一个线程的话,在很短时间内就会产生很多创建和销毁的动作,然而服务器在创建和销毁线程上花费的时间和消耗的系统资源都相当大。线程池就可以尽量减少这种情况的发生。 因此...
ThreadPoolExecutor里面4种拒绝策略(详细)
ThreadPoolExecutor类实现了ExecutorService接口和Executor接口,可以设置线程池corePoolSize,最大线程池大小,AliveTime,拒绝策略等。常用构造方法: ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, B
ThreadPoolExecutor使用和思考-线程池大小设置与BlockingQueue的三种实现区别
查看JDK帮助文档,可以发现该类比较简单,继承自AbstractExecutorService,而AbstractExecutorService实现了ExecutorService接口。   ThreadPoolExecutor的完整构造方法的签名是:   ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, l
扩展ThreadPoolExecutor打印线程错误堆栈
在使用JDK Executors产生线程池执行任务时,如果使用threadPool.submit(Runnable)来提交任务,且不调用future.get时,如果线程发生错误,程序是不会打印错误堆栈的,比如下面的程序,当i==0时,100/i发生运行时异常,只有四组输出(应该有五组),但是程序不会打印任何异常信息, import java.util.concurrent.Synchronous
Java中的线程池——ThreadPoolExecutor的使用
开发过程中,合理地使用线程池可以带来3个好处: 降低资源消耗:通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度:当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性:线程是稀缺资源,如果无限制地创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一分配、调优和监控。 1 线程池的创建 ThreadPoolExecutor有
ThreadPoolExecutor线程的创建与销毁分析
ThreadPoolExecutor线程的创建与销毁分析 固定线程池(newFixedThreadPool) 单例线程池(newSingleThreadExecutor) 缓存线程池(newCachedThreadPool)
ThreadPoolExecutor 工作线程调度和回收
        ThreadPoolExecutor对任务的提交和异步执行已分析完毕,现在要补充一些关于它对线程池的管理,也就是对其工作线程的调度和回收.        还记得上一篇“ThreadPoolExecutor execute 方法分析”最后一个关于任务异步执行的流程图,虽然分支庞杂,但只有两个条逻辑路径会增加工作线程加入到线程池:一是当前线程池的大小&amp;lt;核心线程池大小(即...
【Java】线程池ThreadPoolExecutor实现原理
引言 线程池:可以理解为缓冲区,由于频繁的创建销毁线程会带来一定的成本,可以预先创建但不立即销毁,以共享方式为别人提供服务,一来可以提供效率,再者可以控制线程无线扩张。合理利用线程池能够带来三个好处: 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制的创建...
设计一个线程超时终止的线程池
原贴地址:点击打开链接 起因是公司有一个定时任务,对于几千的VPN,做一个端口映射,去取得对方客户的硬件信息,做一个监控。 但是部分VPN会连接不通,等待的时间又过长,所以设计这么一个线程池。 原贴提供了一个线程超时终止的实现方式,我再在这个基础上,整理成一个线程池。 首先是线程超时终止 import java.util.concurrent.Callable; pub
彻底停止运行线程池ThreadPoolExecutor
最近系统开发时遇到这样一个需求: 该功能执行时间很久,如果运行过程出现错误,也无法将其停止,必须眼睁睁的看着它浪费很久时间,除非停止服务器。 于是,我就想着如何给该功能加上一个“停止”的功能呢? 经过不断的思考和测试,发现思路如此简单,直接上代码! package com.iamzken.test; import java.util.ArrayList; import java.util
python 线程锁的使用
python多线程中,哪些公共资源需要加锁,哪些不需要加锁
线程的创建与线程池ThreadPoolExecutor,Executors
                    线程的创建与线程池及线程池工具类 1.线程的创建方式 1.1继承Thread类重写run方法 public class Test { public static void main(String[] args) { Thread thread = new MyThread(); thread.setName(&quot;mythread001&quot;); ...
ThreadPoolExecutor 如何判断空闲线程
Worker public void run() {            runWorker(this); }        while (task != null || (task = getTask()) != null) { Runnable r = timed ?                    workQueue.poll(keepAliveTime, TimeUnit.NANO...
ThreadPoolExecutor 判断多线程执行完成
1. public boolean isEndTask() {       while (true) {         if (this.ThreadPoolExecutor.getActiveCount() == 0) {           return true;            }          }     }       if (isEndTask())
文章热词 js ipfs UI逻辑线程 机器学习 机器学习课程 机器学习教程 深度学习视频教程
相关热词 android 为什么jni线程 c++ 单例为什么线程不安全 android添加线程播放音乐 为什么学python 为什么要学习python