博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
线程交替运行
阅读量:6813 次
发布时间:2019-06-26

本文共 2467 字,大约阅读时间需要 8 分钟。

package threadtest;    public class Test1 {      /*      * 两个线程,一个打印1-100的奇数,一个打印1-100的偶数;要求:线程1打印5个之后,线程2开始打印,线程2打印5个之后,线程1再开始打印,以此循环。      */      private static int state = 1;      private static int num1 = 1;      private static int num2 = 2;            public static void main(String[] args) {          // TODO Auto-generated method stub          final Test1 t = new Test1();          new Thread(new Runnable(){              @Override              public void run(){                  while(num1<100){                      //两个线程都用t对象作为锁,保证每个交替期间只有一个线程在打印                      synchronized(t){                           // 如果state!=1, 说明此时尚未轮到线程1打印, 线程1将调用t的wait()方法, 直到下次被唤醒                            if(state!=1){                              try{                                  t.wait();                              }catch(InterruptedException e){                                  e.printStackTrace();                              }                          }                          // 当state=1时, 轮到线程1打印5次数字                          for(int j=0;j<5;j++){                              System.out.println(num1);                              num1 +=2;                          }                          // 线程1打印完成后, 将state赋值为2, 表示接下来将轮到线程2打印                            state = 2;                            // notifyAll()方法唤醒在t上wait的线程2, 同时线程1将退出同步代码块, 释放t锁                            t.notifyAll();                        }                  }              }          }).start();                    new Thread(new Runnable(){              @Override              public void run(){                  while(num2<100){                      synchronized(t){                          if(state!=2){                              try{                                  t.wait();                              }catch(InterruptedException e){                                  e.printStackTrace();                              }                          }                                                    for(int i=0;i<5;i++){                              System.out.println(num2);                              num2 +=2;                          }                                                    state=1;                          t.notifyAll();                      }                                                                                }                             }          }).start();           }  }

 

转载于:https://www.cnblogs.com/NEWHOM/p/6730472.html

你可能感兴趣的文章
Mac前端抓包小工具Charles4.0下载
查看>>
用AHP层次分析法挑选最佳结婚对象
查看>>
Subversion安装手记
查看>>
Linux 获取设备树源文件(DTS)里描述的资源【转】
查看>>
Effective C++ 阅读笔记(二)public继承与继承中的函数覆盖
查看>>
什么是UV?
查看>>
Docker 容器测试全探索
查看>>
如何在Ubuntu 16.04中创建GIF动图
查看>>
结构和类的区别
查看>>
Stringbuffer与Stringbuilder源码学习和对比
查看>>
AgileEAS.NET平台开发Step By Step系列-药店系统-索引
查看>>
黑盒测试难还是白盒测试难?
查看>>
jQuery CSS 函数
查看>>
Stanford coursera Andrew Ng 机器学习课程编程作业(Exercise 2)及总结
查看>>
字符输出流Writer简要概括
查看>>
ASP.NET MVC5+EF6+EasyUI 后台管理系统(53)-工作流设计-我的批阅
查看>>
Centos 学习大纲
查看>>
我们前端跟后端是怎么合作的
查看>>
我的第一个Chrome扩展
查看>>
线偏移处理参数说明
查看>>