需要把两个线程的数据组合起来要怎么办

今天面试遇到的问题,需要把两个线程的数据组合起来,怎么保证两个线程执行完成?

我的回答是,new 两个线程T1和T2

然后线程处理完数据后,

T1.join();

T2.join();

这样就会等待两个线程处理完后组装数据。

当时面试官说这是一种实现,问我还有没有其他实现,我说暂时没想到

下面是我面完回家查资料看到的

1.用CyclicBarrier

CyclicBarrier cb= new CyclicBarrier(2);

Thread T1 = new Thread(new Runnable(){
    @Override
    public void run(){
        dosomething;
        cb.await();
    }
});
Thread T2 = new Thread(new Runnable(){
    @Override
    public void run(){
        dosomething;
        cb.await();
    }
});


2.用CountDownLatch

CountDownLatch countDownLatch = new CountDownLatch(2);

Thread T1 = new Thread(new Runnable(){
    @Override
    public void run(){
        dosomething;
        countDownLatch.countDown();
    }
});
Thread T2 = new Thread(new Runnable(){
    @Override
    public void run(){
        dosomething;
        countDownLatch.countDown();
    }
});
countDownLatch.await();

CyclicBarrier与CountDownLatch比较

1.CountDownLatch只能使用一次,CyclicBarrier可以调用reset()重置,可以多次使用

2.CountDownLatch是一个线程(或多个线程)等待另外N个线程完成任务之后才能执行;CyclicBarrier是N个线程互相等待,任何一个线程没完成之前,所有线程必须等待。

3.CountDownLatch基于AQS,CyclicBarrier基于锁和Condition

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 提供了多种方式来处理多线程任务。下面是一些常用的方式: 1. 实现 Runnable 或 Callable 接口,使用线程池来执行任务。 ```java @Service public class MyService { private final ExecutorService executorService = Executors.newFixedThreadPool(10); public void processTask() { for (int i = 0; i < 10; i++) { executorService.execute(new MyTask(i)); } } private static class MyTask implements Runnable { private final int taskId; public MyTask(int taskId) { this.taskId = taskId; } @Override public void run() { // 处理任务 System.out.println("Task " + taskId + " is processing."); } } } ``` 2. 使用 Spring 提供的 @Async 注解,将方法标记为异步执行。 ```java @Service public class MyService { @Async public void processTask(int taskId) { // 处理任务 System.out.println("Task " + taskId + " is processing."); } } ``` 需要在启动类上添加 @EnableAsync 注解,并且在方法上添加 @Async 注解才能生效。 3. 使用 CompletableFuture 来处理异步任务。这种方式相比于上面两种方式更加灵活,可以方便地处理异常、组合多个异步任务等。 ```java @Service public class MyService { @Async public CompletableFuture<String> processTask(int taskId) { return CompletableFuture.supplyAsync(() -> { // 处理任务 System.out.println("Task " + taskId + " is processing."); return "Task " + taskId + " is finished."; }); } } ``` 需要注意的是,这种方式同样需要在启动类上添加 @EnableAsync 注解。 以上是一些常用的处理多线程任务的方式,可以根据具体场景选择合适的方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值