登录 立即注册
安币:

安卓巴士 - 安卓开发 - Android开发 - 安卓 - 移动互联网门户

查看: 368749|回复: 6

使用java concurrent处理并发需求

[复制链接]

206

主题

1622

帖子

2721

安币

Android大神

Rank: 6Rank: 6

发表于 2011-11-7 20:57:21 | 显示全部楼层 |阅读模式
java5开始,增加了concurrent api,用于并发处理。比如起多个线程并发从网络上下载图片,然后在本地显示。
这里写个简单的代码,来说明如何使用concurrent api提供的线程连接池。
运行结果类似这样:
  1. start do 1 task …
  2. >>main thread end.
  3. start do 2 task …
  4. start do 1 finished.
  5. start do 3 task …
  6. start do 2 finished.
  7. start do 3 finished.
复制代码
这里的task1到task3,都做的同样的事情,让它所属的线程休眠2000ms:
  1. private static void doSomething(int id) {
  2.     System.out.println("start do " + id + " task …");
  3.     try {
  4.         Thread.sleep(1000 * 2);
  5.     } catch (InterruptedException e) {
  6.         e.printStackTrace();
  7.     }
  8.     System.out.println("start do " + id + " finished.");
  9. }
复制代码
如果没有java自带的这个api,需要自己或者使用不标准的第三方线程池api。用concurrent api写起来很简洁:

  1. public static void main(String[] args) {
  2.     ExecutorService executorService = Executors.newFixedThreadPool(2);

  3.     executorService.submit(new Runnable() {
  4.         @Override
  5.         public void run() {
  6.             doSomething(1);
  7.         }
  8.     });

  9.     executorService.submit(new Runnable() {
  10.         @Override
  11.         public void run() {
  12.             doSomething(2);
  13.         }
  14.     });

  15.     executorService.submit(new Runnable() {
  16.         @Override
  17.         public void run() {
  18.             doSomething(3);
  19.         }
  20.     });

  21.     executorService.shutdown();
  22.     System.out.println(">>main thread end.");

  23. }
复制代码
首先,创建了一个线程池,里面有2个线程:

  1. ExecutorService executorService = Executors.newFixedThreadPool(2);
复制代码
然后,通过submit()方法,提交一个Runnable的实例,这个实例将交由线程池中空闲的线程执行。
在main线程中直接运行了:
  1. executorService.shutdown();
复制代码
不必担心,线程池不会直接关闭的,只有当它执行完所有提交的任务后才会关闭。如果不写这行,在本例中,应用将不会停止,因为虽然main线程(就是运行main方法的线程,也叫主线程)退出了,但是线程池中依然有线程运行,因此应用(进程)不会退出。
完整源代码见:
http://easymorse.googlecode.com/svn/tags/concurrent.demo-0.1.0/

332

主题

739

帖子

32万

安币

码皇(巴士元老)

Rank: 8Rank: 8

突出贡献终身成就奖

QQ
发表于 2011-11-7 21:50:15 | 显示全部楼层
客户端编程用不上的。

332

主题

739

帖子

32万

安币

码皇(巴士元老)

Rank: 8Rank: 8

突出贡献终身成就奖

QQ
发表于 2011-11-7 21:50:30 | 显示全部楼层
不过了解下,非常有必要。面试时就问了。

0

主题

75

帖子

158

安币

程序猿

Rank: 2

QQ达人

发表于 2012-12-11 09:51:38 | 显示全部楼层
高级技术

0

主题

75

帖子

158

安币

程序猿

Rank: 2

QQ达人

发表于 2012-12-11 09:51:57 | 显示全部楼层
先收藏了

0

主题

61

帖子

448

安币

程序猿

Rank: 2

发表于 2013-3-29 10:34:30 | 显示全部楼层
{:Skateboard:}学习

0

主题

25

帖子

2

安币

初级码农

Rank: 1

发表于 2013-3-29 11:19:05 | 显示全部楼层
{:Music 2:}{:Music 2:}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站长推荐

通过邮件订阅最新安卓weekly信息
上一条 /4 下一条

下载安卓巴士客户端

全国最大的安卓开发者社区
联系我们
关闭
合作电话:
15618560077
Email:
805941275@qq.com
商务市场合作/投稿
问题反馈及帮助
联系我们

广告投放| 广东互联网违法和不良信息举报中心|中国互联网举报中心|下载客户端|申请友链|手机版|站点统计|安卓巴士 ( 粤ICP备15117877号 )

快速回复 返回顶部 返回列表