`

java concurrency 学习 参考资料积累

    博客分类:
  • java
 
阅读更多

 

转自:http://davidlwq.iteye.com/blog/1136095

java concurrency学习

博客分类:

今天看了下java官网上关于concurrency库的教程,了解了下基本知识,在此记录下。

 

线程池

concurrency库中最重要的概念当然是线程池,java中线程池是封闭在Executor接口的实现中的。当我们想执行新的线程中,传统的方法是

 

Java代码 复制代码 收藏代码
  1. new Thread(r).start()
new Thread(r).start()

 

但线程的创建与销毁会造成一定的资源与时间的消耗,设想一下在一个web服务器,如果对每一个新进来的请求都创建一个线程来处理,这样当线程一多,其调试、创建及其本身占用的资源会很严重,甚至有可能导致系统崩溃,利用线程池来管理线程则可以避免这种结果。

 

在java concurrency中提供了新的接口来供用户执行线程,主要包括如下三个:

Executor

ExecutorService

ScheduledExecutorService

 

而线程池则被封闭在这三个接口的实现里,根据这三个接口提供的不同的工厂方法可以创建不同的线程池。

Executor提供了一个execute方法来执行一个Runnable对象;ExecutorService则在此基础上提供了submit方法,此方法返回一个Future对象,用以监控线程状态并获得线程执行的结果;ScheduledExecutorService则提供了scheduleAtFixedRate等方法来重复执行某一个任务。

 

其它

除线程池之外还扩充了集合框架如BlockingQueue,ConcurrentMap等 ,并提供了Lock类来显示地添加锁。另外一个有趣的是其提供的原子变量。

假设我们有一个Counter类,为了保证其线程间同步,我们一般会这样写

 

Java代码 复制代码 收藏代码
  1. class SynchronizedCounter {
  2. privateint c = 0;
  3. publicsynchronizedvoid increment() {
  4. c++;
  5. }
  6. publicsynchronizedvoid decrement() {
  7. c--;
  8. }
  9. publicsynchronizedint value() {
  10. return c;
  11. }
  12. }
class SynchronizedCounter {
    private int c = 0;

    public synchronized void increment() {
        c++;
    }

    public synchronized void decrement() {
        c--;
    }

    public synchronized int value() {
        return c;
    }

}

 

有了原子变量 后,我们可以这样写

 

Java代码 复制代码 收藏代码
  1. import java.util.concurrent.atomic.AtomicInteger;
  2. class AtomicCounter {
  3. private AtomicInteger c = new AtomicInteger(0);
  4. publicvoid increment() {
  5. c.incrementAndGet();
  6. }
  7. publicvoid decrement() {
  8. c.decrementAndGet();
  9. }
  10. publicint value() {
  11. return c.get();
  12. }
  13. }
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框架等,可以参考其它的资料。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics