两个线程,一个打印1-100的奇数,一个打印1-100的偶数;要求:线程1打印5个之后,线程2开始打印,线程2打印5个之后,线程1再开始打印,以此循环。

Code:

  1. package com.qhong;
  2.  
  3. public class Main {
  4. /*
  5. * 两个线程,一个打印1-100的奇数,一个打印1-100的偶数;要求:线程1打印5个之后,线程2开始打印,线程2打印5个之后,线程1再开始打印,以此循环。
  6. */
  7. private static int state = 1;
  8. private static int num1 = 1;
  9. private static int num2 = 2;
  10.  
  11. public static void main(String[] args) {
  12. // TODO Auto-generated method stub
  13. final Main t=new Main();
  14. new Thread(new Runnable(){
  15. @Override
  16. public void run(){
  17. while(num1<100){
  18. //两个线程都用t对象作为锁,保证每个交替期间只有一个线程在打印
  19. synchronized(t){
  20. // 如果state!=1, 说明此时尚未轮到线程1打印, 线程1将调用t的wait()方法, 直到下次被唤醒
  21. if(state!=1){
  22. try{
  23. t.wait();
  24. }catch(InterruptedException e){
  25. e.printStackTrace();
  26. }
  27. }
  28. // 当state=1时, 轮到线程1打印5次数字
  29. for(int j=0;j<5;j++){
  30. System.out.println(num1);
  31. num1 +=2;
  32. }
  33. // 线程1打印完成后, 将state赋值为2, 表示接下来将轮到线程2打印
  34. state = 2;
  35. // notifyAll()方法唤醒在t上wait的线程2, 同时线程1将退出同步代码块, 释放t锁
  36. t.notifyAll();
  37. }
  38. }
  39. }
  40. }).start();
  41.  
  42. new Thread(new Runnable(){
  43. @Override
  44. public void run(){
  45. while(num2<100){
  46. synchronized(t){
  47. if(state!=2){
  48. try{
  49. t.wait();
  50. }catch(InterruptedException e){
  51. e.printStackTrace();
  52. }
  53. }
  54.  
  55. for(int i=0;i<5;i++){
  56. System.out.println(num2);
  57. num2 +=2;
  58. }
  59.  
  60. state=1;
  61. t.notifyAll();
  62. }
  63.  
  64. }
  65. }
  66. }).start();
  67. }
  68. }

Output:

  1. 1
  2. 3
  3. 5
  4. 7
  5. 9
  6. 2
  7. 4
  8. 6
  9. 8
  10. 10
  11. 11
  12. 13
  13. 15
  14. 17
  15. 19
  16. 12
  17. 14
  18. 16
  19. 18
  20. 20
  21. 21
  22. 23
  23. 25
  24. 27
  25. 29
  26. 22
  27. 24
  28. 26
  29. 28
  30. 30
  31. 31
  32. 33
  33. 35
  34. 37
  35. 39
  36. 32
  37. 34
  38. 36
  39. 38
  40. 40
  41. 41
  42. 43
  43. 45
  44. 47
  45. 49
  46. 42
  47. 44
  48. 46
  49. 48
  50. 50
  51. 51
  52. 53
  53. 55
  54. 57
  55. 59
  56. 52
  57. 54
  58. 56
  59. 58
  60. 60
  61. 61
  62. 63
  63. 65
  64. 67
  65. 69
  66. 62
  67. 64
  68. 66
  69. 68
  70. 70
  71. 71
  72. 73
  73. 75
  74. 77
  75. 79
  76. 72
  77. 74
  78. 76
  79. 78
  80. 80
  81. 81
  82. 83
  83. 85
  84. 87
  85. 89
  86. 82
  87. 84
  88. 86
  89. 88
  90. 90
  91. 91
  92. 93
  93. 95
  94. 97
  95. 99
  96. 92
  97. 94
  98. 96
  99. 98
  100. 100

http://blog.csdn.net/junli_chen/article/details/49584187

Java多线程,线程交替执行的更多相关文章

  1. Java多线程--线程交替

    要求:借助同步机制,sleep()方法,join()方法,实现动画显示:甲线程:1.3.5.7.9乙线程:2.4.6.8.10丙线程:a.b.c.d.emain()线程输出:线程开始,线程结束 输出结 ...

  2. Java多线程——线程之间的协作

    Java多线程——线程之间的协作 摘要:本文主要学习多线程之间是如何协作的,以及如何使用wait()方法与notify()/notifyAll()方法. 部分内容来自以下博客: https://www ...

  3. java 多线程—— 线程让步

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  4. java 多线程—— 线程等待与唤醒

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  5. Java多线程--线程及相关的Java API

    Java多线程--线程及相关的Java API 线程与进程 进程是线程的容器,程序是指令.数据的组织形式,进程是程序的实体. 一个进程中可以容纳若干个线程,线程是轻量级的进程,是程序执行的最小单位.我 ...

  6. Java多线程——线程的优先级和生命周期

    Java多线程——线程的优先级和生命周期 摘要:本文主要介绍了线程的优先级以及线程有哪些生命周期. 部分内容来自以下博客: https://www.cnblogs.com/sunddenly/p/41 ...

  7. Java多线程——线程的创建方式

    Java多线程——线程的创建方式 摘要:本文主要学习了线程的创建方式,线程的常用属性和方法,以及线程的几个基本状态. 部分内容来自以下博客: https://www.cnblogs.com/dolph ...

  8. Java多线程——线程之间的同步

    Java多线程——线程之间的同步 摘要:本文主要学习多线程之间是如何同步的,如何使用volatile关键字,如何使用synchronized修饰的同步代码块和同步方法解决线程安全问题. 部分内容来自以 ...

  9. Java多线程——线程八锁案例分析

    Java多线程——线程八锁案例分析 摘要:本文主要学习了多线程并发中的一些案例. 部分内容来自以下博客: https://blog.csdn.net/dyt443733328/article/deta ...

  10. Java多线程-线程的同步(同步方法)

    线程的同步是保证多线程安全访问竞争资源的一种手段.线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源.什么时候需要考虑同步,怎么同步等等问题,当然,这些问题没有很明确的答案,但有些 ...

随机推荐

  1. java基础---->验证码的使用(一)

    验证码是一种区分用户是计算机和人的公共全自动程序.可以防止:恶意破解密码.刷票.论坛灌水,有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登陆尝试,实际上是用验证码是现在很多网站通 ...

  2. c++ 利用new动态的定义二维数组

    #include <iostream> using namespace std; int main() { , col = ; // key code: 申请空间 int **edge = ...

  3. linux ctags

    在vim 下查找函数的定义是比较方法的事情,尤其是是跨文件的时候. 这时候可以通过安装ctags来实现函数定义跳转. 安装可以直接百度. 安装好之后,首先需要配置vim, 因为一般只有vim打开的文件 ...

  4. Hibernate插入、查询、删除操作 HQL

    Hibernate的所有的操作都是通过Session完成的. 基本步骤如下: 1:通过配置文件得到SessionFactory: SessionFactory sessionFactory=new C ...

  5. 教主泡嫦娥[有趣的dp状态设计]

    P1342 教主泡嫦娥 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 2012年12月21日下午3点14分35秒,全世界各国的总统以及领导人都已经汇聚在中国 ...

  6. java面向对象(上)

    一.一些重要的概念理解 Java是面向对象的程序设计语言,提供了类,成员变量,方法等的基本功能.类可被认为是一种自定义的数据类型,可以使用类来定义变量,所有使用类定义的变量都是引用变量.它会引用到类的 ...

  7. C#操作word之插入图片

    假如我们导出一份简历到word文档,那势必可能要同时导出我们包含的简历,下面就来试一下如何和通过C#代码,将图片插入到word文档中. 为了简便起见,就简单一点.类似下面这样的 姓名 张三 照片   ...

  8. ubuntu16.04下安装opencv3的viz模块

    OPENCV3.0默认是不安装VIZ模块的,那么如何安装呢? 如果已经安装了Opencv,现在要增加VIZ模块,应该再安装一次就可以吧,我没试过,我是卸载了原来的,重新安装的 简单来说,就是要多安装一 ...

  9. C/C++ 开放库

    C/C++ 开放库 1.Best C/C++ Network Library 2.A list of open source C++ libraries

  10. 2014年web页面上的3D新产品介绍

    地图对于数据的可视化展现有独到的显示方式,首先是底图.地图提供了一个定位的蓝图,让用例数据可以有参考的背景,因此底图通常是线画矢量图或者影像图.互联网上提供这种服务的基本以Google风格,也就是Ti ...