欢迎来到天天文库
浏览记录
ID:37915428
大小:63.50 KB
页数:10页
时间:2019-06-02
《Android进阶——多线程系列之Semaphore、CyclicBarrier、CountDownLatch》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Android进阶——多线程系列之Semaphore、CyclicBarrier、CountDownLatchSemaphoreSemaphore是一个计数信号量。信号量中维护着一个信号量许可集,线程可以通过调用acquire()来获取信号量的许可。当信号量被许可时,线程可以向下执行,否则线程等待。同时,线程也可以通过release()来释放它的信号量。Semaphore简单的可以理解为一张许可证①饭堂打饭publicclassSemaphoreActivityextendsAppCompatActivity{//线程数privatestaticfi
2、nalintTHREAD_SIZE=5;privateSemaphoresemaphore;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_semaphore);semaphore=newSemaphore(3);for(inti=0;i3、sCanteenThreadextendsThread{@Overridepublicvoidrun(){try{//买到粮票semaphore.acquire();System.out.println(Thread.currentThread().getName()+"号买到粮票");//模拟食堂打饭中System.out.println(Thread.currentThread().getName()+"号窗口开始打饭");Thread.sleep(2000);//提交粮票semaphore.release();System.out.printl4、n(Thread.currentThread().getName()+"号提交粮票");}catch(InterruptedExceptione){e.printStackTrace();}}}}这里模拟了学生到食堂打饭的过程:买到粮票->打饭->提交粮票。其中semaphore代表食堂只有三张粮票的买卖,也可以理解为只有三个打饭窗口。THREAD_SIZE代表有五个学生线程同时打饭。下面通过打印信息来查看执行过程Thread-636号买到粮票Thread-636号窗口开始打饭Thread-632号买到粮票Thread-632号窗口开始打饭Threa5、d-635号买到粮票Thread-635号窗口开始打饭......隔了2秒后Thread-636号提交粮票Thread-633号买到粮票Thread-633号窗口开始打饭Thread-632号提交粮票Thread-634号买到粮票Thread-634号窗口开始打饭Thread-635号提交粮票Thread-633号提交粮票Thread-634号提交粮票可以看到学生们打饭还是井然有序的,打完就撤,留给下一位。Semaphore就是一张通行证,灵活使用它,你就能指挥线程②打印机publicclassPrinterActivityextendsAppCom6、patActivity{//线程数privatestaticfinalintTHREAD_SIZE=5;privateSemaphoresemaphore;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_printer);semaphore=newSemaphore(1);for(inti=0;i7、Thread().start();}}privateclassPrinterThreadextendsThread{@Overridepublicvoidrun(){try{semaphore.acquire();System.out.println(Thread.currentThread().getName()+"进入打印");Thread.sleep(1000);System.out.println(Thread.currentThread().getName()+"打印中...");System.out.println(Thread.curr8、entThread().getName()+"退出打印");semaphore.release();}cat
3、sCanteenThreadextendsThread{@Overridepublicvoidrun(){try{//买到粮票semaphore.acquire();System.out.println(Thread.currentThread().getName()+"号买到粮票");//模拟食堂打饭中System.out.println(Thread.currentThread().getName()+"号窗口开始打饭");Thread.sleep(2000);//提交粮票semaphore.release();System.out.printl
4、n(Thread.currentThread().getName()+"号提交粮票");}catch(InterruptedExceptione){e.printStackTrace();}}}}这里模拟了学生到食堂打饭的过程:买到粮票->打饭->提交粮票。其中semaphore代表食堂只有三张粮票的买卖,也可以理解为只有三个打饭窗口。THREAD_SIZE代表有五个学生线程同时打饭。下面通过打印信息来查看执行过程Thread-636号买到粮票Thread-636号窗口开始打饭Thread-632号买到粮票Thread-632号窗口开始打饭Threa
5、d-635号买到粮票Thread-635号窗口开始打饭......隔了2秒后Thread-636号提交粮票Thread-633号买到粮票Thread-633号窗口开始打饭Thread-632号提交粮票Thread-634号买到粮票Thread-634号窗口开始打饭Thread-635号提交粮票Thread-633号提交粮票Thread-634号提交粮票可以看到学生们打饭还是井然有序的,打完就撤,留给下一位。Semaphore就是一张通行证,灵活使用它,你就能指挥线程②打印机publicclassPrinterActivityextendsAppCom
6、patActivity{//线程数privatestaticfinalintTHREAD_SIZE=5;privateSemaphoresemaphore;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_printer);semaphore=newSemaphore(1);for(inti=0;i7、Thread().start();}}privateclassPrinterThreadextendsThread{@Overridepublicvoidrun(){try{semaphore.acquire();System.out.println(Thread.currentThread().getName()+"进入打印");Thread.sleep(1000);System.out.println(Thread.currentThread().getName()+"打印中...");System.out.println(Thread.curr8、entThread().getName()+"退出打印");semaphore.release();}cat
7、Thread().start();}}privateclassPrinterThreadextendsThread{@Overridepublicvoidrun(){try{semaphore.acquire();System.out.println(Thread.currentThread().getName()+"进入打印");Thread.sleep(1000);System.out.println(Thread.currentThread().getName()+"打印中...");System.out.println(Thread.curr
8、entThread().getName()+"退出打印");semaphore.release();}cat
此文档下载收益归作者所有