面试题:有任务A、任务B和任务C三个任务,怎样保证任务以C、A、B的顺序执行
一 Thread类的join()方法
public static void main(String[] args) {
Random random = new Random();
Thread threadC = new Thread(() -> {
try {
System.out.println("任务C开始执行...");
Thread.sleep(random.nextInt(10) * 100);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Thread threadA = new Thread(() -> {
try {
threadC.join();
System.out.println("任务A开始执行...");
Thread.sleep(random.nextInt(10) * 100);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
Thread threadB = new Thread(() -> {
try {
threadA.join();
System.out.println("任务B开始执行...");
Thread.sleep(random.nextInt(10) * 100);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
threadA.start();
threadB.start();
threadC.start();
// 任务C开始执行...
// 任务A开始执行...
// 任务B开始执行...
}
join()方法是插队执行方法,调用join()方法的线程在指定的线程对象里面插队执行;
二 singleThreadExecutor
使用只有一个工作线程的线程池,任务会按照提交顺序执行
public static void main(String[] args) {
Random random = new Random();
ExecutorService executorService = Executors.newSingleThreadExecutor();
executorService.execute(() -> {
System.out.println("任务C开始执行...");
try {
// 模拟任务执行耗时
Thread.sleep(random.nextInt(10) * 100);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
executorService.execute(() -> {
System.out.println("任务A开始执行...");
try {
// 模拟任务执行耗时
Thread.sleep(random.nextInt(10) * 100);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
executorService.execute(() -> {
System.out.println("任务B开始执行...");
try {
// 模拟任务执行耗时
Thread.sleep(random.nextInt(10) * 100);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
executorService.shutdown();
// 任务C开始执行...
// 任务A开始执行...
// 任务B开始执行...
}