天天看點

Java多線程--線程交替

要求:

借助同步機制,sleep()方法,join()方法,實作動畫顯示;

甲線程:1、3、5、7、9

乙線程:2、4、6、8、10

丙線程:a、b、c、d、e

main()線程輸出:線程開始,線程結束

輸出結果:線程開始,1-a-2## 3-b-4## 5-c-6## …

思考:

使用多個判斷标記,模拟(消費者-生産者)每線程輸出一個後就等待,然後改變自己的标記

臨界資源–使用多個== putX() == 方法,判斷屬于自己的标記(== isEmptyX ==)然後輸出

使多個線程有序的交替執行

代碼:

class Resource{

private boolean isEmpty01 = true;

private boolean isEmpty02 = false;

private boolean isEmpty03 = false;

//每個put方法對應一個輸出,每輸出一個就等待,等待其他人的喚醒

public void put1(){

while(!isEmpty01){

try{

wait();

}catch(InterruptedException e){

e.printStackTrace();

}

//輸出後

isEmpty01 = false;

isEmpty02 = true;

notifyAll();

public void put2(){

while(!isEmpty02){

isEmpty02 = false;

isEmpty03 = true;

public void put3(){

while(!isEmpty03){

isEmpty03 = false;

isEmpty01 = true;

class Player01 implements Runnable{

private Resource res;

private String[] arr;

Player01(){}

Player01(String[] arr,Resource res){

this.arr = arr;

this.res = res;

public void run(){

synchronized(res){

for(int i=0;i<arr.length;i++){

//錯誤的點

//61,62,這兩句不能交換順序

res.put1();

System.out.print(arr[i]+"-");

Thread.sleep(1000);

class Player02 implements Runnable{

Player02(){}

Player02(String[] arr,Resource res){

res.put2();

class Player03 implements Runnable{

Player03(){}

Player03(String[] arr,Resource res){

res.put3();

System.out.print(arr[i]+"## ");

class Test08{

public static void main(String[] args){

String[] arr1 = {"1","3","5","7","9"};

String[] arr2 = {"a","b","c","d","e"};

String[] arr3 = {"2","4","6","8","0"};

Resource res = new Resource();

Player01 p1 = new Player01(arr1,res);

Player02 p2 = new Player02(arr2,res);

Player03 p3 = new Player03(arr3,res);

Thread t1 = new Thread(p1);

Thread t2 = new Thread(p2);

Thread t3 = new Thread(p3);

t1.start();

t2.start();

t3.start();

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

137

138

139

140

141

142

143

144

145

執行結果:

重要的是:

這種利用标記可以實作超過2個線程的有序交替執行

---------------------