六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 35|回复: 0

java concurrency学习

[复制链接]

升级  52%

4

主题

4

主题

4

主题

童生

Rank: 1

积分
26
 楼主| 发表于 2013-2-3 13:47:39 | 显示全部楼层 |阅读模式
今天看了下java官网上关于concurrency库的教程,了解了下基本知识,在此记录下。
 
线程池

concurrency库中最重要的概念当然是线程池,java中线程池是封闭在Executor接口的实现中的。当我们想执行新的线程中,传统的方法是
 
new Thread(r).start() 
 但线程的创建与销毁会造成一定的资源与时间的消耗,设想一下在一个web服务器,如果对每一个新进来的请求都创建一个线程来处理,这样当线程一多,其调试、创建及其本身占用的资源会很严重,甚至有可能导致系统崩溃,利用线程池来管理线程则可以避免这种结果。
 
在java concurrency中提供了新的接口来供用户执行线程,主要包括如下三个:
Executor
ExecutorService
ScheduledExecutorService
 
而线程池则被封闭在这三个接口的实现里,根据这三个接口提供的不同的工厂方法可以创建不同的线程池。
Executor提供了一个execute方法来执行一个Runnable对象;ExecutorService则在此基础上提供了submit方法,此方法返回一个Future对象,用以监控线程状态并获得线程执行的结果;ScheduledExecutorService则提供了scheduleAtFixedRate等方法来重复执行某一个任务。
 
其它

除线程池之外还扩充了集合框架如BlockingQueue,ConcurrentMap等 ,并提供了Lock类来显示地添加锁。另外一个有趣的是其提供的原子变量。
假设我们有一个Counter类,为了保证其线程间同步,我们一般会这样写
 
class SynchronizedCounter {    private int c = 0;    public synchronized void increment() {        c++;    }    public synchronized void decrement() {        c--;    }    public synchronized int value() {        return c;    }}  
有了原子变量 后,我们可以这样写

import java.util.concurrent.atomic.AtomicInteger;class AtomicCounter {    private AtomicInteger c = new AtomicInteger(0);    public void increment() {        c.incrementAndGet();    }    public void decrement() {        c.decrementAndGet();    }    public int value() {        return c.get();    }} 至于其它高级的特性如Fork/Join框架等,可以参考其它的资料。
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

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