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本质上是相通的。