599CN.COM - 【源码之家】老牌网站源码下载站,提供完整商业网站源码下载!

java多线程执行完毕才执行主线程

源码网2023-07-14 11:00:57136JAVA方法线程执行

在多线程编程中,我们常常会遇到需要等待多个线程执行完毕后再执行主线程的情况。本文将介绍在Java中如何实现这一需求。

1. 使用join方法

Java中的Thread类提供了一个join方法,可以将一个线程加入到当前线程中,使得当前线程等待被加入线程执行完毕。

具体使用方法如下:

``` Thread thread1 = new Thread(new Runnable() { @Override public void run() { // 线程1的执行逻辑 } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { // 线程2的执行逻辑 } }); thread1.start(); thread2.start(); try { thread1.join(); thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } ```

在上述代码中,我们创建了两个线程thread1和thread2,并分别启动它们。然后通过调用join方法,使得主线程等待thread1和thread2执行完毕。

2. 使用CountDownLatch

CountDownLatch是Java提供的一个同步辅助类,它可以让一个线程等待其他线程执行完毕后再继续执行。

具体使用方法如下:

``` CountDownLatch latch = new CountDownLatch(2); Thread thread1 = new Thread(new Runnable() { @Override public void run() { // 线程1的执行逻辑 latch.countDown(); } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { // 线程2的执行逻辑 latch.countDown(); } }); thread1.start(); thread2.start(); try { latch.await(); } catch (InterruptedException e) { e.printStackTrace(); } ```

在上述代码中,我们初始化了一个CountDownLatch对象,并指定需要等待的线程数量为2。然后在每个线程的执行逻辑中调用countDown方法来减少需要等待的线程数。最后在主线程中调用await方法,使得主线程等待所有线程执行完毕。

3. 使用线程池

Java中的线程池可以管理和复用线程,通过提交任务到线程池来执行,可以方便地实现多线程执行完毕后再执行主线程的需求。

具体使用方法如下:

``` ExecutorService executor = Executors.newFixedThreadPool(2); executor.execute(new Runnable() { @Override public void run() { // 线程1的执行逻辑 } }); executor.execute(new Runnable() { @Override public void run() { // 线程2的执行逻辑 } }); executor.shutdown(); try { executor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS); } catch (InterruptedException e) { e.printStackTrace(); } ```

在上述代码中,我们通过调用Executors类的newFixedThreadPool方法创建一个固定大小的线程池,并提交需要执行的任务。然后调用shutdown方法关闭线程池,并通过awaitTermination方法等待所有任务执行完毕。

4. 使用CompletableFuture

Java 8引入的CompletableFuture类可以用于创建异步任务,并可以方便地等待多个任务执行完毕。

具体使用方法如下:

``` CompletableFuture future1 = CompletableFuture.runAsync(() -> { // 线程1的执行逻辑 }); CompletableFuture future2 = CompletableFuture.runAsync(() -> { // 线程2的执行逻辑 }); CompletableFuture allFutures = CompletableFuture.allOf(future1, future2); try { allFutures.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } ```

在上述代码中,我们分别创建了两个CompletableFuture对象代表两个异步任务,使用runAsync方法提交需要执行的任务。然后通过allOf方法将所有任务组合起来,并通过get方法等待所有任务执行完毕。

5. 使用Semaphore

Semaphore是Java提供的一个计数信号量,可以用来控制同时访问某个资源的线程数量。

具体使用方法如下:

``` Semaphore semaphore = new Semaphore(0); Thread thread1 = new Thread(new Runnable() { @Override public void run() { // 线程1的执行逻辑 semaphore.release(); } }); Thread thread2 = new Thread(new Runnable() { @Override public void run() { // 线程2的执行逻辑 semaphore.release(); } }); thread1.start(); thread2.start(); try { semaphore.acquire(2); } catch (InterruptedException e) { e.printStackTrace(); } ```

在上述代码中,我们初始化了一个Semaphore对象,并指定许可的数量为0。然后在每个线程的执行逻辑中调用release方法来释放一个许可。最后在主线程中调用acquire方法,使得主线程等待获得指定数量的许可。

总结

本文介绍了在Java中实现多线程执行完毕才执行主线程的五种方法:使用join方法、使用CountDownLatch、使用线程池、使用CompletableFuture和使用Semaphore。这些方法各具特点,可以根据具体需求选择适合的方式来实现。

转载声明:本站发布文章及版权归原作者所有,转载本站文章请注明文章来源!

本文链接:https://599cn.com/post/9908.html