`
hulianwang2014
  • 浏览: 690867 次
文章分类
社区版块
存档分类
最新评论
  • bcworld: 排版成这样,一点看的欲望都没有了
    jfinal

Java并发编程之线程管理(Executor框架11)

 
阅读更多

4线程执行器

如果你不得不开发一个需要运行许多并发任务的程序,这种方法有下面这些劣势:


Ø 你不得不实现所有相关代码来管理线程对象(对象的创建,结束,获取结果)。

Ø 每个任务,你需要创建一个线程。如果你不得不执行一个超大量的任务,这将影响到应用程序的吞吐量。处理不好,会影响系统的整体性能。

Ø 你不得不高效地控制和管理计算机的系统资源。如果你创建了太对的线程,你的系统资源会变得不到充分利用。


从Java 5以后,Java 并发API提供了一个机制来解决这些问题。这个机制是称作执行器框架(Executor Framework),它围绕着接口Executor,它的子接口ExecutorService,类ThreadPoolExecutor实现了这两个接口。

使用一个executor,你仅需要实现Runnable,并发送给executor对象。Executor对象负责执行,实例化,和运行必要的线程。它的功能远不止这些,它使用线程池帮助提高了系统的性能。运用线程池,避免了连续不断的产生线程的花费,这样合理利用了系统资源。另外,Executor框架是一个callable接口,调用call方法可以返回执行结果。同时,你将获得一个实现了Future接口的对象,使用这个对象来控制线程的状态和Callable对象的返回值。

1.1创建一个线程执行器

使用Executor 框架的第一步骤就是创建一个ThreadPoolExecutor类,你能够使用四个参数的构造方法或者使用一个叫做Executors工厂类来创建ThreadPoolExecutor对象。一旦你有一个executor对象,你可以发送Runnable或者Callable对象,执行对应的业务逻辑。

看一个例子,首先创建一个Task类,实现所需要执行的业务逻辑。

import java.util.Date;
import java.util.concurrent.TimeUnit;
 
/**
 * This class implements aconcurrent task
 *
 */
public class Task implements Runnable {
 
    /**
     * The start date of the task
     */
    private Date initDate;
    /**
     * The name of the task
     */
    private String name;
   
    /**
     * Constructor of the class. Initializes thename of the task
     * @param name name asigned to the task
     */
    public Task(String name){
        initDate=new Date();
        this.name=name;
    }
   
    /**
     * This method implements the execution of thetask. Waits a random period of time and finish
     */
    @Override
    public voidrun() {
        System.out.printf("%s: Task %s: Created on: %s\n",Thread.currentThread().getName(),name,initDate);
        System.out.printf("%s: Task %s: Started on: %s\n",Thread.currentThread().getName(),name,new Date());
       
        try {
            Long duration=(long)(Math.random()*10);
            System.out.printf("%s: Task %s: Doing a task during %d seconds\n",
                              Thread.currentThread().getName(),
                              name,
                              duration);
            TimeUnit.SECONDS.sleep(duration);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
       
        System.out.printf("%s: Task %s: Finished on: %s\n",Thread.currentThread().getName(),name,new Date());
    }
 
}
 

创建Worker类,定义自己的线程池执行器,管理线程的执行情况。

import java.util.concurrent.Executors;
importjava.util.concurrent.ThreadPoolExecutor;
 
public class Worker {
 
    /*ThreadPoolExecutorsto manage the execution of the request */
    private ThreadPoolExecutor executor;
   
    public Worker(){
        executor = (ThreadPoolExecutor)Executors.newCachedThreadPool();
    }
   
   
    /**
     * This method is called when a request to theserver is made. The
     * server uses the executor to execute therequest that it receives
     * @param task The request made to the server
     */
    public voidexecuteTask(Task task){
        System.out.printf("Server: A new task has arrived\n");
        executor.execute(task);
        System.out.printf("Server: Pool Size: %d\n",executor.getPoolSize());
        System.out.printf("Server: Active Count: %d\n",executor.getActiveCount());
        System.out.printf("Server: Completed Tasks: %d\n",executor.getCompletedTaskCount());
    }
   
    /**
     * Ends the task with shutdown() method.
     */
    public voidendTask(){
        executor.shutdown();
    }
   
    public staticvoidmain(String []args){
       
        Worker worker = new Worker();
       
        for(int i = 0; i < 100; i++){
            Task task = new Task("task_"+ i);
            worker.executeTask(task);
        }
       
    }
}

在这个例子中,你通过使用newCachedThreadPool()方法创建了一个缓存线程池。这个方法返回一个ExecutorService对象。因此,它被强制转换成ThreadPoolExecutor。如果缓存的线程池需要去执行一个新任务时,它将使用那些已经运行完的线程来执行新线程的任务。线程的重新利用,有利于减少创建新线程的时间,这是它的优势所在。然而,它的劣势就是总存在为新任务准备的常量线程,这样的话,如果你发送大量的任务给executor,你将使系统超过负荷。

分享到:
评论

相关推荐

    Java并发编程实战

    6.2 Executor框架 6.2.1 示例:基于Executor的Web服务器 6.2.2 执行策略 6.2.3 线程池 6.2.4 Executor的生命周期 6.2.5 延迟任务与周期任务 6.3 找出可利用的并行性 6.3.1 示例:串行的页面渲染器 6.3.2 ...

    《Java并发编程的艺术》源代码

    Java并发编程的艺术 作者:方腾飞 魏鹏 程晓明 著 丛书名:Java核心技术系列 出版日期 :2015-07-25 ISBN:978-7-111-50824-3 第1章介绍Java并发编程的挑战,向读者说明进入并发编程的世界可能会遇到哪些问题,以及如何...

    Java并发编程实践 PDF 高清版

    本书的读者是那些具有一定Java编程经验的程序员、希望了解Java SE 5,6在线程技术上的改进和新特性的程序员,以及Java和并发编程的爱好者。 目录 代码清单 序 第1章 介绍 1.1 并发的(非常)简短历史 1.2 线程的...

    针对于Executor框架,Java API,线程共享数据

    Executor框架是Java并发编程中的一个重要工具,它提供了一种管理线程池的方式,使得我们可以更方便地管理线程的生命周期和执行线程任务。 原子操作是指不可被中断的操作,要么全部执行成功,要么全部不执行。原子...

    Java 并发编程实战

    6.2 Executor框架 6.2.1 示例:基于Executor的Web服务器 6.2.2 执行策略 6.2.3 线程池 6.2.4 Executor的生命周期 6.2.5 延迟任务与周期任务 6.3 找出可利用的并行性 6.3.1 示例:串行的页面渲染器 6.3.2 ...

    Java并发编程原理与实战

    Executor框架详解.mp4 实战:简易web服务器(一).mp4 实战:简易web服务器(二).mp4 JDK8的新增原子操作类LongAddr原理与使用.mp4 JDK8新增锁StampedLock详解.mp4 重排序问题.mp4 happens-before简单概述.mp4 锁的...

    Java 7并发编程实战手册

    如果你是一名Java开发人员,并且想进一步掌握并发编程和多线程技术,并挖掘Java 7并发的新特性,那么本书是你的合适之选。 《Java 7并发编程实战手册》 第1章 线程管理 1 1.1 简介 1 1.2 线程的创建和运行...

    Java并发编程的艺术

    第1章介绍Java并发编程的挑战,会向读者说明可能会遇到哪些问题,以及如何解决。第2章Java并发编程的底层实现原理,从CPU和JVM2个层面剖析。第3章详细深入介绍了Java的内存模型。第4章从介绍多线程技术带来的好处...

    Java并发编程的艺术_非扫描

    Java并发编程的艺术_非扫描本书特色本书结合JDK的源码介绍了Java并发框架、线程池的实现原理,帮助读者做到知其所以然。本书对原理的剖析不仅仅局限于Java层面,而是深入到JVM,甚至CPU层面来进行讲解,帮助读者从更...

    龙果 java并发编程原理实战

    龙果 java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四...

    JAVA并发编程实践_中文版(1-16章全)_1/4

    6.2 executor 框架 6.3 寻找可强化的并行性 第7章 取消和关闭 7.1 任务取消 7.2 停止基于线程的服务 7.3 处理反常的线程终止 7.4 jvm关闭 第8章 应用线程池 8.1 任务与执行策略问的隐性耦合 8.2 定制线程池的大小 ...

    龙果java并发编程完整视频

    第53节Executor框架详解00:36:54分钟 | 第54节实战:简易web服务器(一)00:55:34分钟 | 第55节实战:简易web服务器(二)00:24:36分钟 | 第56节JDK8的新增原子操作类LongAddr原理与使用00:17:45分钟 | 第57节...

    汪文君高并发编程实战视频资源下载.txt

    │ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...

    Java 并发编程原理与实战视频

    java并发编程原理实战 第2节理解多线程与并发的之间的联系与区别 [免费观看] 00:11:59分钟 | 第3节解析多线程与多进程的联系以及上下文切换所导致资源浪费问题 [免费观看] 00:13:03分钟 | 第4节学习并发的四个...

    2万字Java并发编程面试题合集(含答案,建议收藏)

    2万字Java并发编程面试题合集(含答案,建议收藏) 具体如下 1、在 java 中守护线程和本地线程区别?2、线程与进程的区别?3、什么是多线程中的上下文切换?4、死锁与活锁的区别,死锁与饥饿的区别?5、Java 中用到...

    Java并发编程part2

    中文完整版的Java并发编程实践PDF电子书 作者:Brian Gogetz Tim Peierls Joshua Bloch Joseph Bowbeer David Holmes Doug Lea 译者:韩锴 方秒 目录 第1章 介绍 1.1 并发的(非常)简短历史 1.2 线程的优点 1.3 ...

    Java并发编程实践part1

    中文完整版的Java并发编程实践PDF电子书 作者:Brian Gogetz Tim Peierls Joshua Bloch Joseph Bowbeer David Holmes Doug Lea 译者:韩锴 方秒 目录 第1章 介绍 1.1 并发的(非常)简短历史 1.2 线程的优点 1.3 ...

    汪文君高并发编程实战视频资源全集

    │ Java并发编程.png │ ppt+源码.rar │ 高并发编程第二阶段01讲、课程大纲及主要内容介绍.wmv │ 高并发编程第二阶段02讲、介绍四种Singleton方式的优缺点在多线程情况下.wmv │ 高并发编程第二阶段03讲、...

Global site tag (gtag.js) - Google Analytics