1.线程饥饿锁

定义:在线程池中,如果任务的执行依赖其他任务,那么可能会产生线程饥饿锁。尤其是单线程线程池。

示例:

public class ThreadDeadStarveTest {

    public ExecutorService executor = Executors.newSingleThreadExecutor();

    public class DoSomeThing implements Callable {

        @Override
public String call() throws Exception { Future<String> f1,f2; f1 = executor.submit(() -> {
return "hello ";
}); f2 = executor.submit(() -> {
return "world ";
}); // 此处产生死锁,因为线程正在执行DoSomeThing,导致线程阻塞 ,但是f1.get()需要返回值,却没有线程去帮忙执行,导致死锁。 return f1.get() + f2.get();
}
} public static void main(String[] args) throws ExecutionException, InterruptedException {
ThreadDeadStarveTest threadDeadStarveTest = new ThreadDeadStarveTest();
Future<String> submit = threadDeadStarveTest.executor.submit(threadDeadStarveTest.new DoSomeThing());
submit.get();
} }

2.线程池的大小

可以参考这篇文章 并发编程网:如何定义线程池的大小

3.配置ThreadPoolExecutor

Executors提供了很多静态方法来创建线程池,但是其内部都是通过构造ThreadPoolExecutor来实现的。注意线程池创建的时候不会立刻执行,只有当有任务进来的时候才会,如果需要创建并运行,可调用prestartAllCoreThread。

public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
Executors.defaultThreadFactory(), defaultHandler);
}
  • corePoolSize: 线程的目标大小,在没有执行任务的时候的大小,当工作的任务队列满了以后才会创建新的线程。
  • maximumPoolSize:可同时活动的线程上限大小。
  • keepAliveTime:空闲存活时间。当某个线程的空闲时间超过该值,那么将该线程标记为可回收。当线程池当前大小超过基本大小,该线程将被终止。

注意:这里有个需要注意的是,在java1.5的第一个版本。工作队列不是SynchronousQueue的时候,那么当线程的基本大小为0的时候会产生奇怪的现象。如果线程池的当前数量等于基本数量的时候,那么只有当工作队列满的时候才会创建新的线程。那么就会出现这样的情况,线程池添加任务后始终不执行,当工作队列满了的情况下才开始执行。

然后在之后的版本中:



增加了等于的判断。从而避免了上述情况的发生

【java并发编程实战】第八章:线程池的使用的更多相关文章

  1. Java 并发编程——Executor框架和线程池原理

    Eexecutor作为灵活且强大的异步执行框架,其支持多种不同类型的任务执行策略,提供了一种标准的方法将任务的提交过程和执行过程解耦开发,基于生产者-消费者模式,其提交任务的线程相当于生产者,执行任务 ...

  2. [Java并发编程(二)] 线程池 FixedThreadPool、CachedThreadPool、ForkJoinPool?为后台任务选择合适的 Java executors

    [Java并发编程(二)] 线程池 FixedThreadPool.CachedThreadPool.ForkJoinPool?为后台任务选择合适的 Java executors ... 摘要 Jav ...

  3. [Java并发编程(一)] 线程池 FixedThreadPool vs CachedThreadPool ...

    [Java并发编程(一)] 线程池 FixedThreadPool vs CachedThreadPool ... 摘要 介绍 Java 并发包里的几个主要 ExecutorService . 正文 ...

  4. Java 并发编程——Executor框架和线程池原理

    Java 并发编程系列文章 Java 并发基础——线程安全性 Java 并发编程——Callable+Future+FutureTask java 并发编程——Thread 源码重新学习 java并发 ...

  5. Java并发编程、多线程、线程池…

    <实战java高并发程序设计>源码整理https://github.com/petercao/concurrent-programming/blob/master/README.md Ja ...

  6. Java并发编程之深入理解线程池原理及实现

    Java线程池在实际的应用开发中十分广泛.虽然Java1.5之后在JUC包中提供了内置线程池可以拿来就用,但是这之前仍有许多老的应用和系统是需要程序员自己开发的.因此,基于线程池的需求背景.技术要求了 ...

  7. Java并发编程(08):Executor线程池框架

    本文源码:GitHub·点这里 || GitEE·点这里 一.Executor框架简介 1.基础简介 Executor系统中,将线程任务提交和任务执行进行了解耦的设计,Executor有各种功能强大的 ...

  8. Java并发编程(十一)线程池的使用

    1.new Thread的弊端如下: a. 每次new Thread新建对象性能差. b. 线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom. c. 缺乏更多 ...

  9. java并发编程(四) 线程池 & 任务执行、终止源码分析

    参考文档 线程池任务执行全过程:https://blog.csdn.net/wojiaolinaaa/article/details/51345789 线程池中断:https://www.cnblog ...

  10. Java并发编程:4种线程池和缓冲队列BlockingQueue

    一. 线程池简介 1. 线程池的概念: 线程池就是首先创建一些线程,它们的集合称为线程池.使用线程池可以很好地提高性能,线程池在系统启动时即创建大量空闲的线程,程序将一个任务传给线程池,线程池就会启动 ...

随机推荐

  1. 取火柴游戏||Nim博弈

    好久之前看的sg函数了 好像就记住一个nim博弈qwq 第一次啊看的时候很迷,现在感觉可以了qwq 首先我们来看一个其他的游戏.(以下游戏只有两个人参与,且足够聪明) 两个人在一张圆形的桌子上放等大的 ...

  2. oracle 基础知识(四)常用函数

    SQL中的单记录函数 .ASCII 返回与指定的字符对应的十进制数; SQL') zero,ascii(' ') space from dual; A A ZERO SPACE --------- - ...

  3. MYSQL添加外键关联

    SELECT * from stu st,course co,score sc where st.sid = sc.sid and sc.cid = co.cid 如果我们要给 sid 做一个约束,即 ...

  4. PL/SQL语句快捷输入设置

    设置PL/SQL语句快捷输入的方法,让你成为高效率的人. 1.打开PL/SQL,输入用户并登录 2.并打开Tools->Preferences->Editor->AutoReplac ...

  5. luogu p2615神奇的幻方题解

    目录 题目部分 讲解部分 代码实现 题目部分 题目来源:洛谷p2615 题目描述 幻方是一种很神奇的 N*N矩阵:它由数字 1,2,3,⋯⋯,N×N 构成,且每行.每列及两条对角线上的数字之和都相同. ...

  6. mysql主从延时临时解决办法

    主从延时临时解决办法: 主从延迟严重的原因很多,其中有以下原因: 一.由于无主键大表的delete 和update导致. mysql  主从复制时.如果表上没有主键.会导致update和delete操 ...

  7. sklearn fit transform fit_transform

    scikit-learn提供了一系列转换库,他们可以清洗,降维,提取特征等. 在数据转换中有三个很重要的方法,fit,fit_transform,transform ss=StandardScaler ...

  8. [转]ThinkPHP5 隐藏index.php问题

    ThinkPHP5 隐藏index.php问题 Apache,修改.htaccess文件 ----------------------------------------------------- R ...

  9. Laravel-初步使用

    一.Laravel环境搭建 1.window环境下环境搭建请参考以下链接: 开发环境搭建 - Windows | <Laravel 开发环境部署> | PHP / Laravel 社区文档 ...

  10. scala成长之路(2)对象和类

    scala提供了一种特殊的定义单例的方法:object关键字 scala> object Shabi{ | val age = 0 | val name = "shabi" ...