美文网首页
两个线程池死锁

两个线程池死锁

作者: 机智的河道蟹 | 来源:发表于2019-08-22 12:07 被阅读0次
 public static void scheduleCreateRequest() {
        createRequestExecutor.execute(new Runnable() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName()+"start");

                try {
                    Thread.sleep(4000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName()+"end");
            }
        });
        System.out.println("submit finished");

    }
    public static void main (String[] args) throws InterruptedException {
        createRequestExecutor=new ThreadPoolExecutor(1,1,0L,TimeUnit.MILLISECONDS,new SynchronousQueue<Runnable>(),new ThreadPoolExecutor.DiscardOldestPolicy());

        createRequestScheduled= Executors.newScheduledThreadPool(1);
        createRequestScheduled.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.println(new Date());
                scheduleCreateRequest();
            }
        }, 0, 1, TimeUnit.SECONDS);
        System.out.println("finished");

    }

以上代码会造成“死锁”

条件1

createRequestExecutor 中只有一个线程,并且使用了同步队列SynchronousQueue,拒绝策略DiscardOldestPolicy
此时当有线程在执行时,createRequestScheduled第二次提交时,拒绝策略直接生效

if (!e.isShutdown()) {
                e.getQueue().poll();
                e.execute(r);
}

会继续执行,依然拒绝,继续重复execute,直到StackOverflow。

条件2

createRequestScheduled捕获到StackOverflowError后,不再增加下一次的task。

if (ScheduledFutureTask.super.runAndReset()) {//Error返回false
                setNextRunTime();
                reExecutePeriodic(outerTask);
 }

但createRequestScheduled的线程池会继续从队列中take数据,此时由于队列为空,会await。但是已经没有线程再add。就会一直wait下去。
而createRequestExecutor在执行完第一次后,也因为没有schedule调度而一直wait。都停止运行。

相关文章

  • Java多线程常识

    死锁并发特性线程状态转换基本机制同步与互斥线程池常用工具类(JUC) 死锁 1. 定义 指两个或两个以上的进程在执...

  • 两个线程池死锁

    以上代码会造成“死锁” 条件1 createRequestExecutor 中只有一个线程,并且使用了同步队列Sy...

  • JavaEE面试题总结 Day39 2018-12-29

    什么是线程死锁?死锁如何产生?如何避免线程死锁? 死锁的介绍: 线程死锁是指由于两个或者多个线程互相持有对方所需要...

  • 3/18day13_线程池_死锁_线程的状态_定时器

    复习 今日内容 线程池[重点] 死锁 线程的状态[非常重要] 定时器[重点] 线程池方式 线程池的思想 如果并发的...

  • 使用Thread Pool不当引发的死锁

    简介 多线程锁定同一资源会造成死锁 线程池中的任务使用当前线程池也可能出现死锁 RxJava 或 Reactor ...

  • 线程池 死锁

    线程池 7个参数自定义

  • 5. 死锁

    线程死锁 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序...

  • 6. 使用synchronized实现死锁

    死锁定义 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序...

  • 十.Java并发编程的挑战

    1. 死锁 线程死锁 死锁是指两个或多个线程被阻塞等待获取某些其他线程所持有的锁。当多个线程同时需要相同的锁,但以...

  • 线程池

    线程饥饿:多任务混合在同一池中,如果出现互相影响的状况出现类似死锁的问题。 例如:在一个线程池中,开辟两个线程,执...

网友评论

      本文标题:两个线程池死锁

      本文链接:https://www.haomeiwen.com/subject/cocnsctx.html