1. 写一个双线程轮流打印1-100
其中一个线程打印奇数,另一个线程打印偶数。线程之间通过 wait()和notifyAll()方法进行协调,以确保它们轮流打印数字。
public class Thread1_100 {
static class MyPrinter implements Runnable {
private static final Object lock = new Object();
private static int count = 1; // 起始值从 1 开始
private final boolean isEven; // 当前线程是否打印偶数
public MyPrinter(boolean isEven) {
this.isEven = isEven;
}
@Override
public void run() {
while (true) {
synchronized (lock) {
// 检查是否已经超出范围
if (count > 100) {
break;
}
// 检查当前线程是否需要打印
if ((isEven && count % 2 == 0) || (!isEven && count % 2 == 1)) {
System.out.println(Thread.currentThread().getName() + ": " + count);
count++;
lock.notifyAll(); // 唤醒其他线程
} else {
try {
lock.wait(); // 等待当前线程的打印条件
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
}
public static void main(String[] args) {
Thread evenThread = new Thread(new MyPrinter(true), "EvenThread");
Thread oddThread = new Thread(new MyPrinter(false), "OddThread");
evenThread.start();
oddThread.start();
}
}
2. 3个线程顺序打印1-100
/**
* 三个线程顺序打印1-100
*/
static class MyPrinter2 implements Runnable {
private final int rank; // 每个线程的固定身份
private static final Object lock = new Object(); // 全局共享的锁
private static int count = 1; // 要打印的数字,所有线程共享
public MyPrinter2(int rank) {
this.rank = rank;
}
@Override
public void run() {
while (true) {
synchronized (lock) {
// 判断是否是当前线程需要打印的数字
while ((count - 1) % 3 != rank) {
if (count > 100) {
return; // 超过100时退出线程
}
try {
lock.wait(); // 当前线程等待
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// 如果数字在范围内,当前线程打印