14.9 执行器

来源:互联网 发布:索尼公司 知乎 编辑:程序博客网 时间:2024/05/21 06:12

大量生命周期很短的线程,应该使用线程池。另一方面,线程池限定了线程的总数,避免由于产生大量线程而导致性能降低。


1 线程池

import java.io.*;import java.util.*;import java.util.concurrent.*;/** * @version 1.02 2015-06-21 * @author Cay Horstmann */public class ThreadPoolTest{   public static void main(String[] args) throws Exception   {      try (Scanner in = new Scanner(System.in))      {         System.out.print("Enter base directory (e.g. /usr/local/jdk5.0/src): ");         String directory = in.nextLine();         System.out.print("Enter keyword (e.g. volatile): ");         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)         {         }         pool.shutdown();         int largestPoolSize = ((ThreadPoolExecutor) pool).getLargestPoolSize();         System.out.println("largest pool size=" + largestPoolSize);      }   }}/** * This task counts the files in a directory and its subdirectories that contain a given keyword. */class MatchCounter implements Callable<Integer>{   private File directory;   private String keyword;   private ExecutorService pool;   private int count;   /**    * Constructs a MatchCounter.    * @param directory the directory in which to start the search    * @param keyword the keyword to look for    * @param pool the thread pool for submitting subtasks    */   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();         List<Future<Integer>> results = new ArrayList<>();         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;   }   /**    * Searches a file for a given keyword.    * @param file the file to search    * @return true if the keyword is contained in the file    */   public boolean search(File file)   {      try      {         try (Scanner in = new Scanner(file, "UTF-8"))         {            boolean found = false;            while (!found && in.hasNextLine())            {               String line = in.nextLine();               if (line.contains(keyword)) found = true;            }                     return found;         }      }      catch (IOException e)      {         return false;      }   }}

2 预定执行


3 控制任务组


4 Fork-Join框架

import java.util.concurrent.*;import java.util.function.*;/** * This program demonstrates the fork-join framework. * @version 1.01 2015-06-21 * @author Cay Horstmann */public class ForkJoinTest{   public static void main(String[] args)   {      final int SIZE = 10000000;      double[] numbers = new double[SIZE];      for (int i = 0; i < SIZE; i++) numbers[i] = Math.random();      Counter counter = new Counter(numbers, 0, numbers.length, x -> x > 0.5);      ForkJoinPool pool = new ForkJoinPool();      pool.invoke(counter);      System.out.println(counter.join());   }}class Counter extends RecursiveTask<Integer>{   public static final int THRESHOLD = 1000;   private double[] values;   private int from;   private int to;   private DoublePredicate filter;   public Counter(double[] values, int from, int to, DoublePredicate filter)   {      this.values = values;      this.from = from;      this.to = to;      this.filter = filter;   }   protected Integer compute()   {      if (to - from < THRESHOLD)      {         int count = 0;         for (int i = from; i < to; i++)         {            if (filter.test(values[i])) count++;         }         return count;      }      else      {         int mid = (from + to) / 2;         Counter first = new Counter(values, from, mid, filter);         Counter second = new Counter(values, mid, to, filter);         invokeAll(first, second);         return first.join() + second.join();      }   }}

5 Completable Futures

0 0
原创粉丝点击