常用的Java线程阻塞业务方法

这篇具有很好参考价值的文章主要介绍了常用的Java线程阻塞业务方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在Java中常常使用到多线程处理一些业务,但是也会遇到多线程处理时带来的业务逻辑时序不对问题,例如需要等待一个业务处理完或者下一步的逻辑需要等待多线程得到的结果,下面是几种常用的方法文章来源地址https://www.toymoban.com/news/detail-861880.html

  1. 使用 Thread.join() 方法
    对于已知的线程列表,可以遍历列表并调用每个线程的 join() 方法。join() 会让当前线程阻塞,直到指定的线程执行完毕。
List<Thread> threads = ...; // 创建并启动线程的列表

for (Thread t : threads) {
    t.join(); // 当前线程(主线程)会等待t线程执行完毕
}

// 这里所有的线程都已经执行完毕
System.out.println("All threads have finished.");

  1. 使用 CountDownLatch
    CountDownLatch 是一个计数器,允许一个或多个线程等待其他一组线程完成操作。初始化时设定一个计数值,每当一个任务完成时,调用 countDown() 方法使计数值减一。当计数值变为零时,所有等待在 await() 方法上的线程将被释放。
import java.util.concurrent.CountDownLatch;

CountDownLatch latch = new CountDownLatch(NUM_THREADS); // 初始化计数器,NUM_THREADS为线程数量

for (int i = 0; i < NUM_THREADS; i++) {
    Thread worker = new Thread(() -> {
        // 执行任务
        ...

        latch.countDown(); // 任务完成,计数器减一
    });
    worker.start();
}

latch.await(); // 主线程在此处等待,直到计数器归零(即所有任务完成)

System.out.println("All threads have finished.");

  1. 使用 CyclicBarrier
    CyclicBarrier 是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点(即所有线程都到达)才继续执行。与 CountDownLatch 不同的是,它可以重用,并且在所有线程到达屏障时可以触发一个回调操作。
import java.util.concurrent.CyclicBarrier;

CyclicBarrier barrier = new CyclicBarrier(NUM_THREADS, () -> {
    System.out.println("All threads have reached the barrier.");
});

for (int i = 0; i < NUM_THREADS; i++) {
    Thread worker = new Thread(() -> {
        // 执行任务
        ...

        try {
            barrier.await(); // 当前线程到达屏障点并阻塞,直到所有线程都到达
        } catch (InterruptedException | BrokenBarrierException e) {
            // 处理异常
        }
    });
    worker.start();
}

  1. 使用 ExecutorService 和 Future
    如果使用 java.util.concurrent.ExecutorService 来管理线程池,可以利用其提供的 shutdown() 和 awaitTermination() 方法来等待所有任务完成:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

ExecutorService executor = Executors.newFixedThreadPool(NUM_THREADS);

// 提交任务到线程池
for (Runnable task : tasks) {
    executor.submit(task);
}

executor.shutdown(); // 停止接收新任务,现有任务继续执行

try {
    if (!executor.awaitTermination(TIMEOUT, TimeUnit.SECONDS)) { // 等待所有任务完成,超时抛出异常
        executor.shutdownNow(); // 尝试强制停止未完成的任务
        throw new TimeoutException("Tasks did not finish within the specified timeout.");
    }
} catch (InterruptedException e) {
    executor.shutdownNow(); // 当前线程被中断,尝试强制停止未完成的任务
    Thread.currentThread().interrupt(); // 重新设置中断状态
}

System.out.println("All tasks have finished.");

到了这里,关于常用的Java线程阻塞业务方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包