参考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();
}
}
};
}
}