public class A implements Runnable { @Override public void run() { // TODO Auto-generated method stub System.out.println("A"); } } public class B implements Runnable { @Override public void run() { // TODO Auto-generated method stub System.out.println("B"); } } public class C implements Runnable { @Override public void run() { // TODO Auto-generated method stub System.out.println("C"); } } /** * 方法一: * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { // TODO Auto-generated method stub Thread thread1 = new Thread(new A()); thread1.start(); thread1.join(); Thread thread2 = new Thread(new B()); thread2.start(); thread2.join(); Thread thread3 = new Thread(new C()); thread3.start(); }
使用join()方法,等前一個線程執行完畢,下一個線程才能執行
import java.util.ArrayList; import java.util.List; /** * 保證多個線程順序執行 * @author 塵世間迷茫的小書童 * */ public class TestJoin { public static void main(String[] args) { List<Thread> threads = new ArrayList<>(); for(int i=0; i<100; i++) { threads.add(new Thread(() -> { System.out.println(Thread.currentThread().getName()); }, "線程"+i)); } threads.forEach(thread -> { thread.start(); try { thread.join(); //具體實現調用Object wait方法 } catch (InterruptedException e) { e.printStackTrace(); } }); } }
/** * 方法二: */ @Test public void test2() { //創建只有一根線程的線程池 ExecutorService executorService = Executors.newSingleThreadExecutor(); executorService.submit(new A()); executorService.submit(new B()); executorService.submit(new C()); executorService.shutdown(); }
創建一個只有一根線程的線程池,保證所有任務按照指定順序執行
/** * 線程順序執行類 * @author 15735400536 * */ public class StepOver { private volatile int count = 1; public void a() throws InterruptedException { synchronized (this) { while(count != 1) { wait(); } System.out.println("線程A"); count = 2; notifyAll(); // if(count == 1) { // System.out.println("線程A"); // count = 2; // //Thread.currentThread().notifyAll(); // notifyAll(); // }else { // //Thread.currentThread().wait(1000); // wait(); // } } } public void b() throws InterruptedException { synchronized (this) { while(count != 2) { wait(); } System.out.println("線程B"); count = 3; notifyAll(); // if(count == 2) { // System.out.println("線程B"); // count = 3; // //Thread.currentThread().notifyAll(); // notifyAll(); // }else { // //Thread.currentThread().wait(1000); // wait(); // } } } public void c() throws InterruptedException { synchronized (this) { while(count != 3) { wait(); } System.out.println("線程C"); count = 1; notifyAll(); // if(count == 3) { // System.out.println("線程C"); // count = 0; // //Thread.currentThread().notifyAll(); // notifyAll(); // }else { // //Thread.currentThread().wait(1000); // wait(); // } } } } public class ThreadA implements Runnable { private StepOver stepOver; public ThreadA(StepOver stepOver) { this.stepOver = stepOver; } @Override public void run() { // TODO Auto-generated method stub try { stepOver.a(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public class ThreadB implements Runnable { private StepOver stepOver; public ThreadB(StepOver stepOver) { this.stepOver = stepOver; } @Override public void run() { // TODO Auto-generated method stub try { stepOver.b(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public class ThreadC implements Runnable { private StepOver stepOver; public ThreadC(StepOver stepOver) { this.stepOver = stepOver; } @Override public void run() { // TODO Auto-generated method stub try { stepOver.c(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 方法三 */ @Test public void test3() { StepOver stepOver = new StepOver(); for(int i=0; i<10 ; i++) { Thread b = new Thread(new ThreadB(stepOver)); b.start(); Thread a = new Thread(new ThreadA(stepOver)); a.start(); Thread c = new Thread(new ThreadC(stepOver)); c.start(); } }
面試的時候,面試官問你怎么保證多個線程順序執行多半都是考察多線程的join方法,join方法的實現調用了Object的wait方法,所以上面說到的方法1和方法3本質上是相通的。