三线程
package hr.test;
//臨界區,用于控制打印線程的工作順序和互斥操作
class Mutex{
private int order=1; //記錄線程順序號
private int maxNum=0; //最大線程數
Mutex(int num){
this.maxNum=num;
}
//循環設置下一次要打印的順序號
public void setOrder(){
this.order=(++order)<=maxNum?order:1;
}
//得到順序號
public int getOrder(){
return this.order;
}
}
//打印工作
class PrintRunnable implements Runnable{
private Object[] cont=null; //打印內容
private int order=-1; //當前線程的打印順序
private Mutex mutex=null; //臨界區對象
PrintRunnable(Object[] c,int o,Mutex m){
this.cont=c;
this.order=o;
this.mutex=m;
}
public void run(){
try{
//循環打印內容
for(Object c:cont){
//互斥操作臨界區
synchronized(mutex){
//如果當前工作線程的順序號不等于臨界區的順序號,則工作線程等待阻塞,并放棄鎖
while(mutex.getOrder()!=this.order)
mutex.wait();
//打印內容
System.out.println(c);
//設置下一次允許打印的線程順序
mutex.setOrder();
//喚醒在臨界區等待的所有線程
mutex.notifyAll();
}
}
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
//測試
public class Test {
public static void main(String[] args){
Integer[] number={1,2,3,4};
Character[] upperChar={'A','B','C','D'};
Character[] lowerChar={'a','b','c','d'};
Mutex mutex=new Mutex(3);
new Thread(new PrintRunnable(number,1,mutex)).start();
new Thread(new PrintRunnable(upperChar,2,mutex)).start();
new Thread(new PrintRunnable(lowerChar,3,mutex)).start();
}
}
?
轉載于:https://www.cnblogs.com/ouyangping/p/6517926.html
總結
- 上一篇: 睡觉的诀窍:睡五分钟等于六钟头?
- 下一篇: Fabrice Bellard