一道考察多线程基本功的题目
程序员文章站
2022-07-12 08:54:05
...
题目
启动两个线程, 一个输出 1,3,5,7…99, 另一个输出 2,4,6,8…100 最后 STDOUT 中按序输出 1,2,3,4,5…100。
要求用 Java 的 wait + notify 机制来实现
提示:wait和notify必须配合synchronized使用
代码
public class PrintNum{
//可以是任意一个对象,或者自定义的对象
static Object o1 = new Object();
public static volatile List<Integer> list1=new ArrayList<>();
public static volatile List<Integer> list2=new ArrayList<>();
public static volatile List<Integer> mergelist=new ArrayList<>();
public static void main(String[] args) {
Thread a = new Thread(()->{
synchronized (o1) {//ThreadB获取o1的对象锁
System.out.println("偶数开始打印-------");
for (int i = 1; i <= 100; i++) {
if(i%2==0){
System.out.print(i+" ");
list2.add(i);
}
}
o1.notify();//ThreadB释放o1的对象锁,通知其他等待o1对象锁的线程继续运行
}
});
a.start();
Thread b = new Thread(()->{
synchronized (o1) {//ThreadB获取o1的对象锁
System.out.println("");
System.out.println("奇数开始打印-------");
for (int i = 1; i <= 100; i++) {
if(i%2!=0){
System.out.print(i+" ");
list1.add(i);
}
}
o1.notify();//ThreadB释放o1的对象锁,通知其他等待o1对象锁的线程继续运行
}
});
b.start();
synchronized (o1)// 主线程获取o1的对象锁
{
try {
System.out.println("");
System.out.println("等俩个线程打印完执行总的打印---------");
o1.wait(200);//o1的对象锁释放,主线程进入等待状态
for (int i = 0; i < list1.size(); i++) {
System.out.print(list1.get(i)+" "+list2.get(i)+" ");
}
} catch (InterruptedException e) {
}
}
}
}
运行结果:
上一篇: leetcode 72. 编辑距离