首页 > java > 计一次线程死锁

计一次线程死锁

作者:bin

当线程池并发任务处理时,如果使用的是同一个线程池,那么很有可能出现线程的死锁
Flux的parallel方法可以创建多任务处理,Flux会在程序启动时,就初始化好线程池,不管后面调用多少次parallel(),都只会相同都线程池中的线程去执行多任务处理。

我们看如下2个嵌套,A嵌套A1,A执行完毕都前提是,A1执行完毕。

 public void A() throws InterruptedException {
    int threadCount = 4;
    final CountDownLatch latch = new CountDownLatch(threadCount);
    //多线程
    Flux.fromIterable(listTask)
            .parallel(threadCount)
            .runOn(Schedulers.elastic())
            .subscribe(
                    //分发更多的子任务,A1,A2..
                    task -> { A1(); },
                    //异常也算结束
                    error -> { latch.countDown(); },
                    //正常结束
                    () ->{ latch.countDown(); }
            );
    latch.await();
}
public void A1() {
    int threadCount = 4;
    final CountDownLatch latch = new CountDownLatch(threadCount);
    Flux.fromIterable(listTask)
            .parallel(threadCount)
            .runOn(Schedulers.elastic())
            .subscribe(
                    task -> {},
                    error -> { latch.countDown(); },
                    latch::countDown
            );
    try {
        latch.await();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

线程死锁的原因,如果同一个[线程1],执行A恰好又执行A1,那么就会出现死锁,
即任务A等待A1执行完成,A1等待[线程1]执行完成A释放出来执行A1。如图

如何避免这种情况呢?
避免多任务嵌套时,使用相同线程池,如果刚好父子都是统一线程,有死锁风险

您必须 [ 登录 ] 才能发表留言!