ExecutorService使用

来源:互联网 发布:微博评论屏蔽淘宝链接 编辑:程序博客网 时间:2024/06/04 19:35

参考Android API:http://www.android-doc.com/reference/java/util/concurrent/ExecutorService.html

eg:

ExcecutorService为线程池接口,将线程加进线程池中,execute后不是马上执行,在不久未来异步执行线程。所以会产生并发问题,需要对线程中的共享资源加锁。

import java.util.concurrent.*;import java.util.*;class ExecutorServiceTest{static final int COUNT=10;static int signal=1;public static void main(String[] args) {ExecutorService pool=Executors.newFixedThreadPool(COUNT);int i;for(i=0;i<COUNT+10;i++){pool.execute(getThread());}pool.shutdown();for(i=0;i<COUNT+10;i++){//抛出异常java.util.concurrent.RejectedExecutionException因为pool.shutdow<span style="white-space:pre"></span><span style="font-family: Arial, Helvetica, sans-serif; font-size: 12px;">pool.execute(getThread());</span>
}}public static Runnable getThread(){return new Runnable(){public void run(){synchronized(b.class){  //System.out.println("signal="+signal);signal++;}}};}}

2.Semaphore信号量类的使用:用于控制线程池中的线程数量,以达到线程公平分配资源的效果。

eg:

acquire()方法:若池中的线程数量已经达到了信号量规定的线程数量,该线程则在线程池外边等着;反之,该线程进入到线程池中。

release()方法:若线程池中的一个线程执行完毕,则将信号量减一。

eg:一个厕所三个坑,门外有盏信号灯,信号灯显示坑被占用了的数量。没有空坑,就在门外先等着;有,就可以进厕所去占坑。

import java.util.concurrent.*;import java.util.*;class b{static final int COUNT=10;static int signal=1;static Semaphore s;public static void main(String[] args) throws Exception{ExecutorService pool=Executors.newFixedThreadPool(COUNT);s=new Semaphore(3);int i;for(i=0;i<COUNT;i++){s.acquire();pool.execute(getThread(i+1));}pool.shutdown();}public static Runnable getThread(int i){return new Runnable(){public void run(){synchronized(b.class){System.out.println("signal="+signal+"  i="+i);signal++;b.s.release();}}};}}



0 0
原创粉丝点击