好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java实现线程通信的案例讲解

什么是线程通信、如何实现?

所谓线程通信就是线程间相互发送数据,线程通信通常通过共享一个数据的方式实现。

线程间会根据共享数据的情况决定自己该怎么做,以及通知其他线程怎么做。

线程通信常见模型

生产者与消费者模型:生产者线程负责生产数据,消费者线程负责消费数据。

要求:生产者线程生产完数据后,唤醒消费者,然后等待自己;消费者消费完该数据后,唤醒生产者,然后等待自己

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

public class 多线程_5线程通信 extends Thread{

 

     public static void main(String[] args) {

         //定义线程类,创建一个共享的账户对象

         account3 a= new account3( "abc" , 0 );

         //创建两个取钱的线程对象

         new drawthread3(a, "小明" ).start();

         new drawthread3(a, "小红" ).start();

         //创建三个存钱的线程对象

         new savethread(a, "存钱罐1号" ).start();

         new savethread(a, "存钱罐2号" ).start();

         new savethread(a, "存钱罐3号" ).start();

     }

}

//存钱的线程类

class savethread extends Thread{

     //接收处理的账户对象

     private account3 acc;

     public savethread(account3 acc,String name){

         super (name);

         this .acc=acc;

     }

     public void run(){

         try {

             while ( true ){

                 //存钱

                 acc.savemoney( 100000 );

                 //休眠2秒

                 Thread.sleep( 2000 );

             }

         } catch (Exception e) {

             e.printStackTrace();

         }

     }

}

//取钱的线程类

class drawthread3 extends Thread{

     //接收处理的账户对象

     private account3 acc;

     public drawthread3(account3 acc,String name){

         super (name);

         this .acc=acc;

     }

     public void run(){

         try {

             while ( true ){

                 //取钱

                 acc.drawmoney3( 100000 );

                 //休眠2秒

                 Thread.sleep( 2000 );

             }

         } catch (Exception e) {

             e.printStackTrace();

         }

     }

}

class account3{

     private String cartId;

     private double money; //账户余额

 

     public account3() {

     }

 

     public account3(String cartId, double money) {

         this .cartId = cartId;

         this .money = money;

     }

 

     public String getCartId() {

         return cartId;

     }

 

     public void setCartId(String cartId) {

         this .cartId = cartId;

     }

 

     public double getMoney() {

         return money;

     }

 

     public void setMoney( double money) {

         this .money = money;

     }

 

     public synchronized void savemoney( double money) {

         //先获取是谁来存钱,线程名即是人名

         String name=Thread.currentThread().getName();

         //判断账户是否有钱

         try {

             if ( this .money== 0 ){

                 //没钱,存钱

                 this .money+=money;

                 System.out.println(name+ "来存钱,存了:" +money+ "存钱后余额为:" + this .money);

                 //有钱了

                 //唤醒所有线程

                 this .notifyAll();

                 //锁对象,让当前线程进入等待

                 this .wait();

             } else {

                 //有钱,不存钱

                 //唤醒所有线程

                 this .notifyAll();

                 //锁对象,让当前线程进入等待

                 this .wait();

             }

         } catch (Exception e) {

             e.printStackTrace();

         }

     }

 

     public synchronized void drawmoney3( double money) {

         //先获取是谁来取钱,线程名即是人名

         String name=Thread.currentThread().getName();

         try {

             //判断账户是否够钱

             if ( this .money>=money){

                 //有钱,取钱

                 this .money-=money;

                 System.out.println(name+ "来取钱成功,取了:" +money+ "余额是:" + this .money);

                 //没钱了

                 //唤醒所有线程

                 this .notifyAll();

                 //锁对象,让当前线程进入等待

                 this .wait();

             } else {

                 //余额不足

                 //唤醒所有线程

                 this .notifyAll();

                 //锁对象,让当前线程进入等待

                 this .wait();

             }

         } catch (Exception e) {

             e.printStackTrace();

         }

     }

}

以上就是Java实现线程通信的案例讲解的详细内容,更多关于Java线程通信的资料请关注其它相关文章!

原文链接:https://blog.csdn.net/qq_62731133/article/details/124436328

查看更多关于Java实现线程通信的案例讲解的详细内容...

  阅读:14次