问题一
三个不同的线程将会共用一个 Test实例。
线程 A 将会调用 one() 方法
线程 B 将会调用 two() 方法
线程 C 将会调用 three() 方法
以确保 two() 方法在 one() 方法之后被执行,three() 方法在 two() 方法之后被执行
LockSupport实现方式
public class ThreAdalternate {
public static void one(){
System.out.println("执行one方法");
}
public static void two(){
System.out.println("执行tow方法");
}
public static void three(){
System.out.println("执行three方法");
}
public static void main(String[] args) {
Thread threadC = new Thread(()->{
LockSupport.park();
three();
},"ThreadC");
Thread threadB = new Thread(()->{
LockSupport.park();
two();
LockSupport.unpark(threadC);
},"threadB");
Thread threadA=new Thread(() -> {
one();
LockSupport.unpark(threadB);
},"threadA");
threadA.start();
threadB.start();
threadC.start();
}
}
分析 此问题就是线程的交替打印 ,我们可以通过LockSupport进行实现,首先将threadB和threadC都park()阻塞,当线程A执行完毕通过unpark()唤醒线程B,线程B执行完毕通过unpark()唤醒线程C。完成线程交替打印。
问题2
编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
LockSupport实现方式
public class ThreadLoopPrint {
private static class UserThread extends Thread {
private Thread nextThread;
public UserThread(String name) {
setName(name);
}
public void setNextThread(Thread nextThread) {
this.nextThread = nextThread;
}
@Override
public void run() {
for (int i = 0; i < 10; i++) {
LockSupport.park();
System.out.println(Thread.currentThread().getName());
LockSupport.unpark(nextThread);
}
}
}
public static void main(String[] args) throws InterruptedException {
UserThread threadA = new UserThread("A");
UserThread threadB = new UserThread("B");
UserThread threadC = new UserThread("C");
// 线程A唤醒线程B
threadA.setNextThread(threadB);
// 线程B唤醒线程C
threadB.setNextThread(threadC);
// 线程C唤醒线程A
threadC.setNextThread(threadA);
// 依次开启A B C线程
threadA.start();
threadB.start();
threadC.start();
// 先唤醒线程A
LockSupport.unpark(threadA);
}
}
分析当线程A、B、C启动后都会被阻塞,首先唤醒线程A 线程A设置要唤醒的是线程B,线程B设置要唤醒的是线程C,线程C设置唤醒的是线程A,所有当线程A唤醒后依次唤醒
B->C->A,然后交替打印,完成线程交替执行。