黑马程序员---Lock和Condition

来源:互联网 发布:淘宝联盟挣钱 编辑:程序博客网 时间:2024/06/07 21:57

---------------------- android培训、java培训、期待与您交流! ----------------------

感觉Lock和Condition比synchronized要好理解一点
说不定也是学完synchronized之后的感觉...

功能是强大许多

张老师说那个主线程子线程交替的面试题

还可以拓展一下 写成3个线程的

于是我就再拓展了一下

写了一个DoSomething类
可以传递3个参数
1.实现了Runnable的对象
2.线程数量
3.需要loop的次数
然后就会自动建立线程循环按顺序
调用Runnable对象的run方法


import java.util.concurrent.locks.*;class DoSomething{private boolean[] run=null;//记录各个线程可否运行的booleanprivate ReentrantLock lock=null;private Condition[] condition=null;//各个线程的conditionprivate Thread[] thread=null;//线程数组private int count=0;private int current=0;//当前线程的脚标号private Runnable task=null;private int loop=0;//剩余循环次数public DoSomething(Runnable task,int count,int loop){this.count=count;this.task=task;this.loop=loop;lock=new ReentrantLock();run=new boolean[count];condition=new Condition[count];thread=new Thread[count];for(int i=0;i<count;i++){condition[i]=lock.newCondition();run[i]=false;thread[i]=new Thread(new Task(i));}run[0]=true;//从第一个线程开始for(int i=0;i<count;i++)thread[i].start();}class Task implements Runnable{private int num;//记录线程的脚标号public Task(int num){this.num=num;}public void run(){while(loop-->0){lock.lock();while(!run[num]){try{condition[num].await();//线程对应的condition的await}catch(InterruptedException e){e.printStackTrace();}}System.out.println(Thread.currentThread().getName() +"start");task.run();System.out.println(Thread.currentThread().getName() +"end\r\n");run[current]=false;//当前线程等待if(++current==count)current=0;//下一个线程boolean设为true,唤醒run[current]=true;//condition[current].signal();//lock.unlock();}}}}class ConditionTest{public static void main(String[] args){new DoSomething(new something(),3,10);}static class something implements Runnable{public void run(){for(int i=0;i<20;i++)System.out.print(i+" ");System.out.println();}}}



---------------------- android培训、java培训、期待与您交流! ----------------------
详细请查看:http://edu.csdn.net/heima
原创粉丝点击