public class AlternatePrinter {
private final Object lock = new Object();
private int count = 0;
private final int maxCount = 50;
public static void main(String[] args) {
AlternatePrinter printer = new AlternatePrinter();
printer.startPrinting();
}
public void startPrinting() {
Thread t1 = new Thread(new PrintRunner('a'));
Thread t2 = new Thread(new PrintRunner('b'));
t1.start();
t2.start();
}
private class PrintRunner implements Runnable {
private final char characterToPrint;
public PrintRunner(char characterToPrint) {
this.characterToPrint = characterToPrint;
}
@Override
public void run() {
while (true) {
synchronized (lock) {
if (count >= maxCount) {
break;
}
// 打印字符并增加计数
System.out.print(characterToPrint);
count++;
// 唤醒其他等待中的线程
lock.notify();
// 当计数未达到上限时,当前线程等待
if (count < maxCount) {
try {
lock.wait();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
}
}
}
}
}
创建实现
Runnable
接口的类:这个类(PrintRunner
)实现了Runnable
接口,这意味着它可以被线程(Thread
)执行。在run
方法中,定义了这个线程应该执行的任务。同步控制:
synchronized(lock)
确保了在任何时刻,只有持有lock
对象锁的线程能进入同步块。这是确保两个线程不会同时执行同步块内代码的关键,从而实现交替打印。线程间通信:
lock.wait()
和lock.notify()
用于线程间的通信。调用wait()
会使当前线程等待,直到另一个线程调用notify()
或notifyAll()
。在这个例子中,一个线程打印字符后,会调用notify()
唤醒另一个线程,然后自己调用wait()
进入等待状态。这样,两个线程就可以交替执行。创建线程并启动:通过
PrintRunner
创建了两个Thread
对象,分别传入不同的字符,然后启动这些线程,它们开始执行run
方法中定义的代码。
通过这种方式,这段代码实现了两个线程交替打印不同的字符,直到达到预定的次数为止。