题目要求
简单来说,就是按序打印,让A打印方法先输出,接着是B,最后是C输出。
题是挺简单的,就当是巩固这几天学习的java多线程了,也熟悉一下JUC的使用。
力扣只给了一个类,我在Ecplise写了一下main函数的调用,AC代码就是那个Foo类。
以下是代码
package multithreading;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
class Foo {
private int number = 1; //当前正在执行线程的标记
private Lock lock = new ReentrantLock();
private Condition condition1 = lock.newCondition();
private Condition condition2 = lock.newCondition();
private Condition condition3 = lock.newCondition();
public Foo() {
}
public void first(Runnable printFirst) throws InterruptedException {
lock.lock(); //互斥访问临界区,上锁
try {
if(number != 1) {
condition1.await();//P操作
}
// printFirst.run() outputs "first". Do not change or remove this line.
printFirst.run();
number = 2;
condition2.signal(); //V操作,唤醒B线程的打印函数
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock(); //解除对临界区的锁
}
}
public void second(Runnable printSecond) throws InterruptedException {
lock.lock();
try {
if(number != 2) {
condition2.await();
}
// printSecond.run() outputs "second". Do not change or remove this line.
printSecond.run();
number = 3;
condition3.signal();
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void third(Runnable printThird) throws InterruptedException {
lock.lock();
try {
if(number != 3) {
condition3.await();
}
// printThird.run() outputs "third". Do not change or remove this line.
printThird.run();
number = 4;
} catch (Exception e) {
e.printStackTrace();
}finally {
lock.unlock();
}
}
}
public class Main {
public static void main(String args[]) {
Foo foo = new Foo();
//创建A、B、C线程,分别调用打印方法
new Thread(new Runnable() {
@Override
public void run() {
try {
foo.second(new Runnable() {
@Override
public void run() {
System.out.println("second");
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
foo.first(new Runnable() {
@Override
public void run() {
System.out.println("one");
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
try {
foo.third(new Runnable() {
@Override
public void run() {
System.out.println("three");
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
}