关闭

Java线程池解析

标签: java线程池线程
304人阅读 评论(0) 收藏 举报
分类:

why thread pool

使用线程池的两个理由:

  • 创建一个新线程的代价昂贵,因为它涉及到与操作系统交互。如果程序需要创建大量的生命周期短的线程,就应该使用 线程池 。一个线程池包含多个准备运行的线程。将Runnable对象提交给线程池,线程池中的一个线程就会调用run方法。当run方法运行完成而退出时,该调用线程并不会死亡,而是在线程池中等待服务下一个请求。
  • 使用线程池的另一个理由是为了减少并发线程数目。创建大量的线程会降低虚拟机的性能,甚至崩溃。如果某个算法会创建大量的线程,应该使用线程数“固定的”线程池来限制并发线程总数目。

what is thread pool

Executor类有多个静态工厂方法来创建线程池,如下表:
方法           方法描述
newCachedTreadPool  必要时创建新线程;空闲线程会被保留60秒
newFixedThreadPool  线程池中线程数目是固定的;空闲线程一直被保留
newSingleThreadExecutor  该池只有一个线程,顺序执行提交的任务

newScheduledThreadPool  用于预定执行而构建的固定线程池,替代java.util.Timer
newSingleThreadScheduledThreadPool  用于预定执行而构建的单线程池

上表中的前三个方法返回值是一个实现了ExecutorService接口的ThreadPoolExecutor类的对象。
可以用以下方法之一来提交Runnable对象或者Callable对象给ExecutorService:
返回值类型  方法
Future<?> submit(Runnable task)
Future< T > submit(Runnable task, T result)
Future< T > submit(Callable task)
线程池会在方便的时候尽早的运行提交的任务。调用submit时,会返回一个Future对象用来查询任务的该任务的状态。
当使用线程池完成任务以后,调用shutdown方法。该方法启动该池的关闭序列。调用shutdown之后的线程池不再接受新的任务。当所有任务完成之后,线程池中所有线程死亡。
另一种关闭方法是shutdownNow,调用该方法后线程池将取消所有尚未开始所有任务并试图中断正在运行的线程。

how to use thread pool

综述,使用连接池(connection pool)需要做的步骤:

  • 调用Executor类的静态方法newCachedThreadPool或者静态方法newFixedThreadPool。
  • 调用submit方法提交Runnable对象或者是Callable对象。
  • 为了能够取消一个任务或提交Callable对象,那就要保存好返回的Future对象。
  • 当你不会再提交任何任务时,调用shutdown方法。
    看个实际的例子吧:
/*
* ThreadPoolTest.java
* 下列代码是在给定的路径下找出给定的关键字出现的次数
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.*;

public class ThreadPoolTest {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("Enter base directory:");
        String directory = in.nextLine();
        System.out.print("Enter keyword:");
        String keyword = in.nextLine();

        ExecutorService pool = Executors.newCachedThreadPool();
        MatchCounter counter = new MatchCounter(new File(directory), keyword, pool);
        Future<Integer> result = pool.submit(counter);

        try {
            System.out.println(result.get() + "matching files.");
        } catch (ExecutionException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        pool.shutdown();

        int largestPoolSize = ((ThreadPoolExecutor) pool).getLargestPoolSize();
        System.out.println("largest pool size=" + largestPoolSize);
    }

}

class MatchCounter implements Callable<Integer>{
    private File directory; 
    private String keyword; 
    private ExecutorService pool;   
    private int count;

    public MatchCounter(File directory, String keyword, ExecutorService pool) {
        this.directory = directory;
        this.keyword = keyword;
        this.pool = pool;
    }

    public Integer call(){
        count = 0;
        try {
            File files[] = directory.listFiles();
            ArrayList<Future<Integer>> results = new ArrayList<Future<Integer>>();

            for (File file : files) {
                if (file.isDirectory()) {
                    MatchCounter counter = new MatchCounter(file, keyword, pool);
                    Future<Integer> result = pool.submit(counter);
                    results.add(result);
                }else {
                    if (search(file))
                        count++;                
                }
            }

            for (Future<Integer> result : results) {
                try {
                    count += result.get();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
            }
        } catch (InterruptedException e) {

        }

        return count;
    }

    /**
     * 在一个文件中查找给定的单词
     */
    public boolean search(File file){
        try {
            Scanner in = new Scanner(new FileInputStream(file));
            boolean found = false;
            while(!found && in.hasNextLine()){
                String line = in.nextLine();
                if (line.contains(keyword)) {
                    found = true;
                }
            }
            in.close();
            return found;
        } catch (IOException e) {
            return false;
        }
    }
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

java源码分析系列一 线程池Executors

用了线程池已经有一段时间了,以前只是偶尔看看源码,了解了其中调度策略,没有深入研究。因为平常没有遇见什么问题。但是作为一个程序员要严格要求自己,做到未雨绸缪废话不说了,开始我们的源码之旅!      ...
  • yangchangji
  • yangchangji
  • 2017-01-12 20:20
  • 1396

Java ThreadPoolExecutor线程池原理及源码分析

一、源码分析(基于JDK1.6) ThreadExecutorPool是使用最多的线程池组件,了解它的原始资料最好是从从设计者(Doug Lea)的口中知道它的来龙去脉。在Jdk1.6中,Threa...
  • scherrer
  • scherrer
  • 2016-02-21 17:27
  • 1075

java线程池---编写自己的线程池

java线程池---编写自己的线程池
  • canot
  • canot
  • 2016-03-16 12:25
  • 6522

Java并发编程:线程池的使用(非常棒,通俗易懂)

Java并发编程:线程池的使用   在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题:   如果并发的线程数量很多,并且每个线程都是执行一个时间...
  • u011531613
  • u011531613
  • 2017-03-13 16:56
  • 14835

Java四种线程池的使用

Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 new...
  • hupitao
  • hupitao
  • 2014-04-25 09:28
  • 19032

Java并发:终止线程和关闭线程池

一、任务的取消1.1标志位class ThreadOne implements Runnable { public volatile boolean isComplete = false; ...
  • jiq408694711
  • jiq408694711
  • 2016-03-29 00:09
  • 12752

Java线程池例子

在做很多高并发应用的时候,单线程的瓶颈已经满足不了我们的需求,此时使用多线程来提高处理速度已经是比较常规的方案了。在使用多线程的时候,我们可以使用线程池来管理我们的线程,至于使用线程池的优点就不用说了...
  • catoop
  • catoop
  • 2015-12-04 23:16
  • 13332

Java 四种线程池的用法分析

介绍new Thread的弊端及Java四种线程池的使用,对Android同样适用,本文是基础篇。转载请标注原地址:http://blog.csdn.net/u011974987/article/de...
  • u011974987
  • u011974987
  • 2016-03-31 16:34
  • 7394

Java中的线程池——3种常用的ThreadPoolExecutor

在Executor框架下,利用Executors的静态方法可以创建三种类型的常用线程池。他们可分别对应不同的应用场景,下面来看看这三个线程池。 1 FixedThreadPool 这个线程...
  • u010723709
  • u010723709
  • 2015-12-24 09:25
  • 2146

Java线程池的设计与实现

权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[+] 1 设计思路 多线程技术主要是针对CPU解决高效执行任务的问题,使用多线程技术可以增加C...
  • zp17764507932
  • zp17764507932
  • 2017-01-17 14:38
  • 1254
    赞赏一个 支付宝扫码
    支付宝
    个人资料
    • 访问:68230次
    • 积分:1451
    • 等级:
    • 排名:千里之外
    • 原创:75篇
    • 转载:7篇
    • 译文:3篇
    • 评论:7条