A.使用阻塞队列存储任务:Runnable,Callable,FutureTask
B.线程池从队列取任务执行:put(),take()
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.Scanner; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.ThreadPoolExecutor; public class MatchCounter implements Callable<Integer> { public static void main(String[] args) { File directory = new File("D:\\project\\sis\\branches\\uat\\play\\test"); String keyword = "class"; //线程池 ExecutorService pool = Executors.newCachedThreadPool(); MatchCounter counter = new MatchCounter(directory, keyword, pool); Future<Integer> result = pool.submit(counter); try { System.out.println(result.get()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) {} pool.shutdown(); //获取线程池同时存在线程的峰值 ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor)pool; int largest = threadPoolExecutor.getLargestPoolSize(); System.out.println("largest pool size = " + largest); } public MatchCounter(File directory, String keyword, ExecutorService threadPool) { this.searchDir = directory; this.keyword = keyword; this.pool = threadPool; this.count = 0; } @Override public Integer call() throws Exception { ArrayList<Future<Integer>> resultList = new ArrayList<>();//保存结果集 for(File file : searchDir.listFiles()){ if(file.isDirectory()) { MatchCounter counter = new MatchCounter(file, keyword, pool); Future<Integer> result = pool.submit(counter);//提交新的任务 resultList.add(result); } else { if(search(file)) count++; } } for(Future<Integer> result : resultList) { count += result.get();//递归 } return count; } private 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 (FileNotFoundException e1) { return false; } } private int count; private File searchDir; private String keyword; private ExecutorService pool; }
相关推荐
现在我们来详细讨论如何利用这些技术实现“BlockingQueue队列自定义超时时间取消线程池任务”。 首先,`BlockingQueue`是一个并发容器,它遵循先进先出(FIFO)原则,具有阻塞性质,当队列满时,生产者线程会被阻塞...
4. 如何控制并发线程数量,例如使用`ThreadPoolExecutor`结合BlockingQueue实现线程池。 通过理解和实践BlockingQueue的使用,开发者可以更好地掌握Java并发编程的核心技术,提高系统的并发性能和稳定性。
线程池的排队策略与BlockingQueue有关。 threadFactory:线程工厂,主要用来创建线程:默认值 DefaultThreadFactory; handler:表示当拒绝处理任务时的策略,就是上面提及的reject操作;有以下四种取值: ...
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue(10); ThreadPoolExecutor executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); ``` 7. **...
BlockingQueue<Runnable> workQueue); ``` - **`corePoolSize`**:线程池的基本大小,在任何时间都会维持这么多线程。 - **`maximumPoolSize`**:线程池允许的最大线程数,当队列满了之后,线程池会继续创建新的...
BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) ``` - **corePoolSize**:线程池的基本大小,在任何时间都会维持这么多线程。 - **maximumPoolSize**:...
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue(); ThreadFactory threadFactory = Executors.defaultThreadFactory(); RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy(); ...
- **阻塞队列(BlockingQueue)**:当队列满时,添加操作会阻塞,空时,移除操作会阻塞。适合线程池的Task Queue。 - **并发队列(ConcurrentQueue)**:线程安全的队列,允许多个线程同时进行读写操作。 - **优先级...
1. 初始化参数:线程池的大小(corePoolSize)、最大线程数(maximumPoolSize)、工作队列(BlockingQueue<Runnable> workQueue)以及超时策略等。这些参数会影响线程池的运行效率和稳定性。 2. 工作线程管理:...
阻塞队列(BlockingQueue)是Java并发包(java.util.concurrent)中的一个重要数据结构,它实现了队列的特性,同时具备线程安全的特性。当队列满时,添加元素的线程会被阻塞,直到队列有空位;当队列为空时,取出...
TimeUnit unit, BlockingQueue<Runnable> workQueue) { if (coreThreadPool || coreThreadPool > maxThreadPool || maxThreadPool || keepAliveTime ) throw new IllegalArgumentException("arg is illegal"); ...
不过,实际生产环境中的线程池实现往往会选择更高效的数据结构,例如`BlockingQueue`,并配合`ExecutorService`的高级特性,如定时任务、工作队列大小控制等。 在实际项目中,使用标准库提供的`ExecutorService`和`...
5. `workQueue`: 任务队列,用于存储等待执行的任务,通常使用`BlockingQueue`实现 构造函数接收这些参数,用于初始化线程池。同时,我们还检查参数的有效性,如确保核心线程数小于最大线程数,存活时间大于0等。 ...
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue(100); // 任务队列,用于存放待执行的任务 ExecutorService executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, ...
`ThreadPoolExecutor`构造函数接收几个关键参数:核心线程数、最大线程数、存活时间、时间单位和工作队列(通常是`BlockingQueue<Runnable>`)。 1. **核心线程数**:线程池维护的最小线程数,即使在空闲时也会保留...
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue(); ExecutorService executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, workQueue); ``` ...
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue(100); ThreadFactory threadFactory = Executors.defaultThreadFactory(); RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy...
2. **线程池参数**:线程池的构造函数通常接受四个参数:核心线程数(corePoolSize)、最大线程数(maximumPoolSize)、任务队列(BlockingQueue<Runnable> workQueue)和线程工厂(ThreadFactory threadFactory)。...
5. **线程安全的数据结构**:在多线程环境中,如任务队列,需要使用线程安全的数据结构(如Java的`BlockingQueue`)来保证数据一致性。 6. **Web服务器基础**:理解HTTP协议的基本原理,包括请求方法(GET、POST等...
线程池的实现通常基于工作队列,如Java中的`BlockingQueue<Runnable>`。当任务被提交到线程池时,会被添加到队列中,然后由空闲的线程取出并执行。这种设计利用了Java的并发工具类,如`wait()`和`notify()`,确保了...