Java允许多个线程同时访问信号量(Semaphore)

  1 示例:仅允许一个线程访问runs()方法
  2 
  3 package com.thread.dome;
  4 
  5 import java.util.concurrent.Semaphore;
  6 
  7 import org.junit.Test;
  8 
  9 public class SemaphoreTest {
 10 
 11     private Semaphore semaphor = new Semaphore(1);//
 12     volatile int count = 0;
 13 
 14     public void runs() {
 15         try {
 16             semaphor.acquire();//获取信号,禁止其他线程进入
 17             System.out.println(Thread.currentThread().getName() + ":进來了");
 18             
 19             //System.out.println(Thread.currentThread().getName() +":"+ (count++));
 20             System.out.println(Thread.currentThread().getName() + ":出去了");
 21             semaphor.release();//释放信号,允许其他线程进入
 22 
 23         } catch (InterruptedException e) {
 24             
 25         }
 26         
 27     }
 28 
 29     @Test
 30     public  void testT() {
 31 
 32         for (int i = 0; i < 10; i++) {
 33 
 34             new Thread(new Runnable() {
 35                 
 36                 @Override
 37                 public void run() {
 38                     
 39                     runs();
 40                 }
 41             }).start();
 42                     
 43                     
 44             
 45 
 46         }
 47 
 48     }
 49 
 50 }
 51 
 52 运行结果:
 53 Thread-0:进來了
 54 Thread-0:出去了
 55 Thread-1:进來了
 56 Thread-1:出去了
 57 Thread-6:进來了
 58 Thread-6:出去了
 59 Thread-5:进來了
 60 Thread-5:出去了
 61 Thread-9:进來了
 62 Thread-9:出去了
 63 Thread-2:进來了
 64 Thread-2:出去了
 65 Thread-4:进來了
 66 Thread-4:出去了
 67 Thread-8:进來了
 68 Thread-8:出去了
 69 
 70 
 71 示例2,允许多个线程同时访问runs()方法
 72 package com.thread.dome;
 73 
 74 import java.util.concurrent.Semaphore;
 75 
 76 import org.junit.Test;
 77 
 78 public class SemaphoreTest {
 79 
 80     private Semaphore semaphor = new Semaphore(5);//允许同时并发调用runs()方法的个数
 81     volatile int count = 0;
 82 
 83     public void runs() {
 84         try {
 85             semaphor.acquire();//获取信号,允许其他线程同时访问,不能超过5
 86             System.out.println(Thread.currentThread().getName() + ":进來了");
 87             
 88             //System.out.println(Thread.currentThread().getName() +":"+ (count++));
 89             System.out.println(Thread.currentThread().getName() + ":出去了");
 90             semaphor.release();//释放信号
 91 
 92         } catch (InterruptedException e) {
 93             
 94         }
 95         
 96     }
 97 
 98     @Test
 99     public  void testT() {
100 
101         for (int i = 0; i < 100; i++) {
102 
103             new Thread(new Runnable() {
104                 
105                 @Override
106                 public void run() {
107                     
108                     runs();
109                 }
110             }).start();
111                     
112                     
113             
114 
115         }
116 
117     }
118 
119 }
120 
121 运行结果:
122 Thread-0:进來了
123 Thread-1:进來了
124 Thread-1:出去了
125 Thread-2:进來了
126 Thread-2:出去了
127 Thread-0:出去了
128 Thread-5:进來了
129 Thread-5:出去了
130 Thread-6:进來了
131 Thread-6:出去了
132 Thread-4:进來了
133 Thread-4:出去了
134 Thread-7:进來了
135 Thread-7:出去了
136 Thread-8:进來了
137 Thread-8:出去了
138 Thread-11:进來了
139 Thread-11:出去了
140 Thread-12:进來了
141 Thread-12:出去了
142 Thread-14:进來了
143 Thread-14:出去了
144 Thread-3:进來了
145 Thread-3:出去了
146 Thread-9:进來了
147 Thread-9:出去了
148 Thread-13:进來了
149 Thread-13:出去了
150 Thread-25:进來了
151 Thread-25:出去了
152 Thread-18:进來了
153 Thread-18:出去了
154 Thread-22:进來了
155 Thread-22:出去了
156 Thread-10:进來了
157 Thread-10:出去了
158 Thread-26:进來了
159 Thread-26:出去了
160 Thread-29:进來了
161 Thread-29:出去了
162 Thread-30:进來了
163 Thread-30:出去了
164 Thread-15:进來了
165 Thread-15:出去了
166 Thread-16:进來了
167 Thread-16:出去了
168 Thread-19:进來了
169 Thread-19:出去了
170 Thread-33:进來了
171 Thread-33:出去了
172 Thread-34:进來了
173 Thread-34:出去了
174 Thread-20:进來了
175 Thread-20:出去了
176 Thread-23:进來了
177 Thread-21:进來了
178 Thread-21:出去了
179 Thread-17:进來了
180 Thread-17:出去了
181 Thread-24:进來了
182 Thread-24:出去了
183 Thread-23:出去了
184 Thread-27:进來了
185 Thread-27:出去了
186 Thread-37:进來了
187 Thread-37:出去了
188 Thread-38:进來了
189 Thread-38:出去了
190 Thread-28:进來了
191 Thread-28:出去了
192 Thread-41:进來了
193 Thread-41:出去了
194 Thread-42:进來了
195 Thread-42:出去了
196 Thread-31:进來了
197 Thread-31:出去了
198 Thread-45:进來了
199 Thread-45:出去了
200 Thread-32:进來了
201 Thread-32:出去了
202 Thread-46:进來了
203 Thread-46:出去了
204 Thread-49:进來了
205 Thread-49:出去了
206 Thread-50:进來了
207 Thread-50:出去了
208 Thread-54:进來了
209 Thread-54:出去了
210 Thread-58:进來了
211 Thread-58:出去了
212 Thread-62:进來了
213 Thread-61:进來了
214 Thread-62:出去了
215 Thread-51:进來了

 

posted on 2018-08-08 21:05  Mature1021  阅读(220)  评论(0)    收藏  举报