【java并发编程实战】第八章:线程池的使用

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并发编程实战】第八章:线程池的使用》

然后在之后的版本中:
《【java并发编程实战】第八章:线程池的使用》
增加了等于的判断。从而避免了上述情况的发生

    原文作者:吃海苔的winton
    原文地址: http://www.cnblogs.com/ywd979/p/9620670.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞