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的时候会产生奇怪的现象。如果线程池的当前数量等于基本数量的时候,那么只有当工作队列满的时候才会创建新的线程。那么就会出现这样的情况,线程池添加任务后始终不执行,当工作队列满了的情况下才开始执行。

然后在之后的版本中:



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

随机推荐

  1. 使用Objective-C 计算代码运行时间

    第一种:(最简单的NSDate) NSDate* tmpStartData = [NSDate date]; //You code here... double deltaTime = [[NSDat ...

  2. [转]逻辑斯蒂回归 via python

    # -*- coding:UTF-8 -*-import numpydef loadDataSet(): return dataMat,labelMat def sigmoid(inX): retur ...

  3. What is hmux in resin?

    When I start the Resin server it says hmux listening to localhost:6802 What is this hmux? Is this a ...

  4. 使用jqMobi开发app基础:弹出内容的设计

    设计APP,因为屏幕非常小.在PC网页山能够放在一体的内容.在APP中就不能放在一起了. 比如例如以下.项目出勤人员非常多,须要弹出一个panel.然后让用户选择,怎样设计呢? 项目出勤panel的内 ...

  5. MVC 5 属性路由中添加自己的自定义约束

    介绍约束 ASP.NET MVC和web api 同时支持简单和自定义约束,简单的约束看起来像: routes.MapRoute("blog", "{year}/{mon ...

  6. 01_ExtJS_HelloWorld

    1, 什么是Ext? Ext是一个Ajax框架,用于在客户端创建丰富多彩的web应用程序界面,是在Yahoo! UI的基础上发展而来的.官方网址:http://www.extjs.com/ 现在改为: ...

  7. 《Oracle Applications DBA 基础》- 9 - Concurrent Processing

    来自:http://www.itpub.net/thread-1411293-1-4.html <Oracle Applications DBA 基础>- 9 - Concurrent P ...

  8. [shell] 脚本之shift和getopts (转载)

    转载地址:http://www.361way.com/shell-shift-getopts/4973.html 建议不熟悉getopts的朋友,此篇要看完,getopts部分内容在原作者上面有改动. ...

  9. OpenCV---其他形态学操作

    一:顶帽实现(原图像与开操作图像的差值) import cv2 as cv import numpy as np def top_hat_demo(image): gray = cv.cvtColor ...

  10. 6A - Daydreamin

    #include <iostream> #include <cstdio> using namespace std; typedef long long ll; ll dp[] ...