要求:
第一个线程:遍历1–1000所有的数字,在遍历过程中,如果发现这个数字能同时被3,5整除则跳过不打印,并立即wait()进入等待,让第二个线程执行。
第二个线程:将一个计数器加一,并打印第几次执行, 之后再唤醒等待的线程。
效果演示:
线程一:1
线程一:2
……(省略)
线程一:12
线程一:13
线程一:14
线程二:第1次执行!
线程一:16
public class Demo {
//定义boolean值
//false代表线程二不执行 true代表线程二执行
static boolean b = false;
public static void main(String[] args) {
//创建线程对象
new MyThread1().start();
new MyThread2().start();
}
}
public class MyThread1 extends Thread {
//打印 从1-100 不打印3和5都能整数的数
@Override
public void run() {
//循环1-100
for (int i = 1; i <= 100; i++) {
//同步代码块
synchronized ("abc"){
//不打印3和5都的倍数
if(i%3==0 && i%5==0){
//让另一个线程执行
"abc".notify();
Demo.b = true;
//自己进入等待状态
try {
"abc".wait();
} catch (InterruptedException e) {
}
}else{
//打印数据
System.out.println("线程一=" + i);
}
}
}
}
}
public class MyThread2 extends Thread {
//线程二 当b是true的时候打印 第几次执行
@Override
public void run() {
//定义计数器
int count = 0;
//因为打印好多次所以要有循环
while(true){
//同步代码块
synchronized ("abc"){
//判断当前线程该不该执行
//如果b是true就执行
if(Demo.b == true){
//输出第几次执行
count++;
System.out.println("线程二第" + count + "次执行");
//执行结束修改b
Demo.b = false;
//叫醒另一个线程
"abc".notify();
}else{
//不执行 进入等待
try {
"abc".wait();
} catch (InterruptedException e) {
}
}
}
}
}
}