Chinaunix首页 | 论坛 | 博客
  • 博客访问: 75125
  • 博文数量: 48
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 340
  • 用 户 组: 普通用户
  • 注册时间: 2013-12-30 14:22
文章分类

全部博文(48)

文章存档

2014年(47)

2013年(1)

我的朋友

分类: 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.

  复制代码

  这里的task1task3,都做的同样的事情,让它所属的线程休眠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方法的线程,也叫主线程)退出了,但是线程池中依然有线程运行,因此应用(进程)不会退出。

阅读(585) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~