线程调度
编写一个程序,开启3个线程,这三个线程的ID分别为A,B,C。每个线程将自己的ID在屏幕上打印10遍,要求输出的结果必须按顺序显示
如 ABCABCABC… 依次递归
- 使用lock锁,等待唤醒机制解答
class LockDemo {
private int num = 1;
private Lock lock = new ReentrantLock();
private Condition conditionA = lock.newCondition();
private Condition conditionB = lock.newCondition();
private Condition conditionC = lock.newCondition();
public void A() {
lock.lock();
try {
if (num != 1) {
conditionA.await();
}
System.out.print(Thread.currentThread().getName());
num = 2;
conditionB.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void B() {
try {
lock.lock();
if (num != 2) {
conditionB.await();
}
System.out.print(Thread.currentThread().getName());
num = 3;
conditionC.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void C() {
try {
lock.lock();
if (num != 3) {
conditionC.await();
}
System.out.print(Thread.currentThread().getName());
num = 1;
conditionA.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
- 使用new Thread()的方式调用
public class ThreadTest {
public static void main(String[] args) {
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
demo.A();
}
}
}, "A").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
demo.B();
}
}
},"B").start();
new Thread(new Runnable() {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
demo.C();
}
}
},"C").start();
}
}
- 执行结果
- 使用线程池,记得关闭线程
public class ThreadTest {
public static void main(String[] args) {
LockDemo demo = new LockDemo();
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
fixedThreadPool.submit(new Runnable() {
@Override
public void run() {
Thread.currentThread().setName("A");
for (int i = 0; i < 10; i++) {
demo.A();
}
}
});
fixedThreadPool.submit(new Runnable() {
@Override
public void run() {
Thread.currentThread().setName("B");
for (int i = 0; i < 10; i++) {
demo.B();
}
}
});
fixedThreadPool.submit(new Runnable() {
@Override
public void run() {
Thread.currentThread().setName("C");
for (int i = 0; i < 10; i++) {
demo.C();
}
}
});
fixedThreadPool.shutdown();
}
}
- 测试结果