版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29479041/article/details/85092846
三个线程按顺序循环执行
- 使用线程之间的通信wait、notify写代码
public class Demo {
private int signal;
public synchronized void a() {
while(signal != 0 ) {//signal等于0打印a
try {
wait();//等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("a");
signal ++;//signal加1
notifyAll();//唤醒
}
public synchronized void b() {
while(signal != 1) {//signal等于1打印b
try {
wait();//等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("b");
signal ++;//signal加1
notifyAll();//唤醒
}
public synchronized void c () {
while(signal != 2) {//signal等于2打印c
try {
wait();//等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("c");
signal = 0;//signal设置为0
notifyAll();//唤醒
}
public static void main(String[] args) {
Demo d = new Demo();
A a = new A(d);
B b = new B(d);
C c = new C(d);
new Thread(a).start();
new Thread(b).start();
new Thread(c).start();
}
}
class A implements Runnable {
private Demo demo;
public A(Demo demo) {
this.demo = demo;
}
@Override
public void run() {
while(true) {
demo.a();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class B implements Runnable {
private Demo demo;
public B(Demo demo) {
this.demo = demo;
}
@Override
public void run() {
while(true) {
demo.b();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class C implements Runnable {
private Demo demo;
public C(Demo demo) {
this.demo = demo;
}
@Override
public void run() {
while(true) {
demo.c();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
- 使用Condition写代码
public class Demo {
private int signal;
Lock lock = new ReentrantLock();
Condition a = lock.newCondition();
Condition b = lock.newCondition();
Condition c = lock.newCondition();
public void a() {
lock.lock();//加锁
while(signal != 0 ) {//signal等于0打印a
try {
a.await();//a等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("a");
signal ++;//signal加1
b.signal();//唤醒b
lock.unlock();// 释放锁
}
public void b() {
lock.lock();//加锁
while(signal != 1) {//signal等于1打印b
try {
b.await();//b等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("b");
signal ++;//signal加1
c.signal();//唤醒c
lock.unlock();// 释放锁
}
public synchronized void c () {
lock.lock();//加锁
while(signal != 2) {//signal等于2打印c
try {
c.await();//c等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("c");
signal = 0;//signal设置为0
a.signal();//唤醒a
lock.unlock();// 释放锁
}
public static void main(String[] args) {
Demo d = new Demo();
A a = new A(d);
B b = new B(d);
C c = new C(d);
new Thread(a).start();
new Thread(b).start();
new Thread(c).start();
}
}
class A implements Runnable {
private Demo demo;
public A(Demo demo) {
this.demo = demo;
}
@Override
public void run() {
while(true) {
demo.a();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class B implements Runnable {
private Demo demo;
public B(Demo demo) {
this.demo = demo;
}
@Override
public void run() {
while(true) {
demo.b();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class C implements Runnable {
private Demo demo;
public C(Demo demo) {
this.demo = demo;
}
@Override
public void run() {
while(true) {
demo.c();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}