分类: Android平台
2014-03-13 10:33:50
之使用java concurrent处理并发需求
java5开始,增加了concurrent api,用于并发处理。比如起多个线程并发从网络上下载图片,然后在本地显示。
这里写个简单的代码,来说明如何使用concurrent api提供的线程连接池。
运行结果类似这样:
start do 1 task …
>>main thread end.
start do 2 task …
start do 1 finished.
start do 3 task …
start do 2 finished.
start do 3 finished.
复制代码
这里的task1到task3,都做的同样的事情,让它所属的线程休眠2000ms:
private static void doSomething(int id) {
System.out.println("start do " + id + " task …");
try {
Thread.sleep(1000 * 2);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("start do " + id + " finished.");
}
复制代码
如果没有java自带的这个api,需要自己或者使用不标准的第三方线程池api。用concurrent api写起来很简洁:
public static void main(String[] args) {
ExecutorService executorService = Executors.newFixedThreadPool(2);
executorService.submit(new Runnable() {
@Override
public void run() {
doSomething(1);
}
});
executorService.submit(new Runnable() {
@Override
public void run() {
doSomething(2);
}
});
executorService.submit(new Runnable() {
@Override
public void run() {
doSomething(3);
}
});
executorService.shutdown();
System.out.println(">>main thread end.");
}
复制代码
首先,创建了一个线程池,里面有2个线程:
ExecutorService executorService = Executors.newFixedThreadPool(2);
复制代码
然后,通过submit()方法,提交一个Runnable的实例,这个实例将交由线程池中空闲的线程执行。
在main线程中直接运行了:
executorService.shutdown();
复制代码
不必担心,线程池不会直接关闭的,只有当它执行完所有提交的任务后才会关闭。如果不写这行,在本例中,应用将不会停止,因为虽然main线程(就是运行main方法的线程,也叫主线程)退出了,但是线程池中依然有线程运行,因此应用(进程)不会退出。