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
- 14.9 执行器
- 执行器
- Web脚本执行器
- 拦截器执行顺序
- 线程执行器
- Executors 执行器
- 执行等待拦截器
- 执行器Executor
- 自定义测试执行器
- 线程执行器
- java线程执行器
- 线程执行器
- 执行器Executor
- Java多线程-执行器
- netty eventLoop执行器
- java线程执行器
- 执行
- 执行
- 14.8 Callable和Future
- sql删除末尾六个零
- 基于通用可编程GPU的视频编解码器——架构、算法与实现
- PhpStorm 基本设置
- 0×80070522客户端没有所需的特权 解决办法
- 14.9 执行器
- 第15周OJ实践3 字符串逆序输出
- 修改sts的默认编码格式,将iso-8859-1 修改为utf-8
- 14.10 同步器
- 27问题的根
- canvas+javascript动画初级应用-鼠标捕捉跟随
- 14.11 线程与Swing
- 算法中伪代码的书写
- Ansible vs SaltStack 谁才是自动化运维好帮手?