参考博客:保证多线程顺序执行,四种方案,你知道几种?

常规操作-启动三个线程执行

public static void main(String[] args) {

Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程1");
}
});

Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程2");
}
});

Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程3");
}
});

thread.start();
thread2.start();
thread3.start();

}

控制台

线程2
线程3
线程1

方案一

join()方法

使用join()方法改进后代码

public static void main(String[] args) {

Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程1");
}
});

Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {

try {
thread.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}

System.out.println("线程2");
}
});

Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {

try {
thread2.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}

System.out.println("线程3");
}
});

thread.start();
thread2.start();
thread3.start();

}

控制台

线程1
线程2
线程3

方案二

CountDownLatch

方案三

单线程池

public static void main(String[] args) {

Thread thread = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("线程1");
}
});

Thread thread2 = new Thread(new Runnable() {
@Override
public void run() {

try {
thread.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}

System.out.println("线程2");
}
});

Thread thread3 = new Thread(new Runnable() {
@Override
public void run() {

try {
thread2.join();
} catch (InterruptedException e) {
throw new RuntimeException(e);
}

System.out.println("线程3");
}
});


ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.submit(thread);
executorService.submit(thread2);
executorService.submit(thread3);

executorService.shutdown();


}

控制台

线程1
线程2
线程3

方案四

CompletableFuture


public static void main(String[] args) {

Thread t1 = new Thread(new Work(),"线程1");
Thread t2 = new Thread(new Work(),"线程2");
Thread t3 = new Thread(new Work(),"线程3");

CompletableFuture.runAsync(()->t1.start()).thenRun(()->t2.start()).thenRun(()->t3.start());

}

static class Work implements Runnable{
@Override
public void run() {
System.out.println("执行"+Thread.currentThread().getName());
}
}

控制台

执行线程1
执行线程2
执行线程3