计一次线程死锁
作者: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。如图
如何避免这种情况呢?
避免多任务嵌套时,使用相同线程池,如果刚好父子都是统一线程,有死锁风险