先看一个简单的:t1 t2 t3三个线程,按顺序串行执行如何实现?
除了使用newSingleThreadPool整一个单工作线程的线程池/使用一个阻塞队列之外.
用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行,为了确保三个线程的顺序你应该先启动最后一个(T3调用T2,T2调用T1),这样T1就会先完成而T3最后完成。
Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。当我们调用某个线程的这个方法时,这个方法会挂起调用线程,直到被调用线程结束执行,调用线程才会继续执行。join方法必须在线程start方法调用之后调用才有意义。如果一个线程没有start,那它也就无法同步。这是由于只有执行完start方法才会创建线程。join才会有意义。
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
System.out.println("t1");
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
try {
// 引用t1线程,等待t1线程执行完
t1.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t2");
}
});
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
try {
// 引用t2线程,等待t2线程执行完
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("t3");
}
});
//这里三个线程的启动顺序可以任意,大家可以试下!
t1.start();
t2.start();
t3.start();
}
然后再看这道问题:三个线程顺序循环输出 就比如线程A/B/C 让你循环输出ABC一共n次
这种情况下使用锁即可,在上锁之后进行判断 只有满足顺序的时候才打印 不然就解锁走人了 所以三个线程不管谁拿到锁,都必须是按照ABC的顺序进行打印,同时成功之后改变状态,使得顺序能够正常的执行.
public class ThreeThread {
private int time;// 控制打印次数
private int state;// 当前状态值:保证三个线程之间交替打印
private Lock lock = new ReentrantLock();
public ThreeThread(int time) {
this.time = time;
}
public void print(String str, int targetNum) {
for (int i = 0; i < time; ) {
lock.lock();//上锁
//只有满足顺序条件的时候才打印 并且state++和i++
if (state % 3 == targetNum) {
state++;
i++;
System.out.print(str);
}
lock.unlock();//解锁
}
}
//ABC三个线程都进入print方法 但是条件中必须满足ABC这样的顺序打印
//他们三个每个线程都有一个i 所以一共每个线程都要打印5次
public static void main(String[] args) {
ThreeThread th = new ThreeThread(5);
Thread A = new Thread(() -> {
th.print("A", 0);
});
Thread B = new Thread(() -> {
th.print("B", 1);
});
Thread C = new Thread(() -> {
th.print("C", 2);
});
B.start();
A.start();
C.start();
}
}