import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class LockTest {
private static volatile int curNum = 1;
private static int n = 10;
ReentrantLock lock = new ReentrantLock();//奇数和偶数的锁
Condition c2 = lock.newCondition();
Condition c3 = lock.newCondition();
boolean flag = true;
//三个线程,第一个线程打印奇数,第二第三交替打印偶数
public static void main(String[] args) throws InterruptedException {
new LockTest().start();
}
public void start() {
//打印奇数线程
new Thread(() -> {
while (true) {
if (curNum > n) {
break;
}
if (curNum % 2 == 0) {
Thread.yield();
continue;
}
try {
lock.lock();
System.out.println(Thread.currentThread().getName()+ ":" + curNum);
curNum++;
if (flag) {
c2.signal();
} else {
c3.signal();
}
flag = !flag;
} catch (Exception e) {
e.printStackTrace();
} finally {
// try {
// Thread.sleep(1000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
System.out.println("执行了unlock");
lock.unlock();
}
}
}).start();
new Thread(() -> {
while (true) {
if (curNum > n) {
break;
}
if (curNum % 2 != 0) {
Thread.yield();
continue;
}
try {
lock.lock();
c2.await();
System.out.println(Thread.currentThread().getName()+ ":" + curNum);
curNum++;
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}).start();
new Thread(() -> {
while (true) {
if (curNum > n) {
break;
}
if (curNum % 2 != 0) {
Thread.yield();
continue;
}
try {
lock.lock();
System.out.println(Thread.currentThread().getName()+ ":" + curNum);
curNum++;
c3.await();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}).start();
}
}
给数字n,一个线程负责打印奇数,另外两个线程负责交替 打印偶数,要求顺序打印
最新推荐文章于 2022-03-16 17:27:37 发布