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()方法,等前一个线程执行完毕,下一个线程才能执行
importjava.util.ArrayList;importjava.util.List;/*** 保证多个线程顺序执行
*@author尘世间迷茫的小书童
**/
public classTestJoin {public static voidmain(String[] args) {
List 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本质上是相通的。