黑马程序员 -->齐头并进完成任务--多线程(下)

----------------------  ASP.Net+Android+IOS开发 .Net培训 、期待与您交流! ---------------------- 

在学习多线程间的通信问题时,先分析一下,毕老师讲的经典例子之----<进货,出货>

  
  

1.  class Res//资源(也就是货物)

2.  {

3.  String name;

4.  String sex;

5.  boolean flag = false;//放一个标示,用于保证俩个线程交替运行

6.  }

8.  class Input implements Runnable//Input类实现Runnable接口

9.  {

10. private Res r;

11. Input(Res r)

12. {

13.      this.r=r;

14. }

15. public void run()

16. {

17.      int x = 0;//定义变量

18.      while(true)//循环判断

19.      {

20.         synchronized(r)//没有同步就会出现安全问题,注意:锁(r)必须是唯一

21.            {

22.            if(r.flag)//判断标示是否为真

23.               try{r.wait();}catch(Exception e){}//如果r.flagtrue则需要wait

25.              if(x==0)//用于做切换,为0man,否则存女

26.              {

27.                  r.name="mike";

28.                  r.sex="man";

29.              }

30.              else

31.              {

32.                  r.name="丽丽";

33.                  r.sex="女女女女女女";

34.              }

35.              x = (x+1)%2;//判断模,来控制打印mike还是丽丽

36.              r.flag = true;//Input将标记改为true,万一抢到执行权,标示为真,它需要等待

37.              r.notify();//叫醒,必须是本类叫醒,需要r.notify(),等待线程在线程池中,被唤醒的是第一个等待的线程

38.          }

39.      }

40. }

41. }

42.

43. class Output implements Runnable

44. {

45. private Res r;

46. Output(Res r)

47. {

48.      this.r=r;

49. }

50. public void run()

51. {

52.      while(true)

53.      {

54.          synchronized(r)//都在处理同一个资源,所以需要同步

55.          {

56.              if(!r.flag)//OutputInput正好相反,判断为false则等待

57.                  try{r.wait();}catch(Exception e){}

58.              System.out.println(r.name+"-----"+r.sex);

59.              r.flag=false;//Output将标记改为false,返回判断!r.flagtrue,则需要等待

60.              r.notify();//它唤醒第一个等待的线程

61.          }

62.      }

63. }

64. }

 

66. class InputOutDemo

67. {

68. public static void main(String[] args)

69. {

70.      Res r = new Res();//创建资源,共享数据

71. /*

73.      Input in = new Input(r);//将共享数据存入本类对象中

74.      Output out = new Output(r);//将共享数据存入本类对象中

75.  

76.      Thread t1 = new Thread(in);//创建一个线程

77.      Thread t2 = new Thread(out);//创建一个线程

78.      t1.start();//启动线程,执行t1run方法

79.      t2.start();//启动线程,执行t2run方法

80. */

81.     // 此处可简写为以下代码:

82.       new Thread(new Input(r)).start();

83.       new Thread(new Input(r)).start();

84.  }

85. }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值