`

BlockingQueue+线程池

    博客分类:
  • Java
 
阅读更多

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队列自定义超时时间取消线程池任务”。 首先,`BlockingQueue`是一个并发容器,它遵循先进先出(FIFO)原则,具有阻塞性质,当队列满时,生产者线程会被阻塞...

    BlockingQueue的使用

    4. 如何控制并发线程数量,例如使用`ThreadPoolExecutor`结合BlockingQueue实现线程池。 通过理解和实践BlockingQueue的使用,开发者可以更好地掌握Java并发编程的核心技术,提高系统的并发性能和稳定性。

    java线程池概念.txt

    线程池的排队策略与BlockingQueue有关。 threadFactory:线程工厂,主要用来创建线程:默认值 DefaultThreadFactory; handler:表示当拒绝处理任务时的策略,就是上面提及的reject操作;有以下四种取值:  ...

    线程池管理线程demo

    BlockingQueue&lt;Runnable&gt; workQueue = new LinkedBlockingQueue(10); ThreadPoolExecutor executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); ``` 7. **...

    线程池java

    BlockingQueue&lt;Runnable&gt; workQueue); ``` - **`corePoolSize`**:线程池的基本大小,在任何时间都会维持这么多线程。 - **`maximumPoolSize`**:线程池允许的最大线程数,当队列满了之后,线程池会继续创建新的...

    java线程池的使用方式

    BlockingQueue&lt;Runnable&gt; workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) ``` - **corePoolSize**:线程池的基本大小,在任何时间都会维持这么多线程。 - **maximumPoolSize**:...

    JAVA使用线程池查询大批量数据

    BlockingQueue&lt;Runnable&gt; workQueue = new LinkedBlockingQueue(); ThreadFactory threadFactory = Executors.defaultThreadFactory(); RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy(); ...

    线程池&&队列各类区别使用场景

    - **阻塞队列(BlockingQueue)**:当队列满时,添加操作会阻塞,空时,移除操作会阻塞。适合线程池的Task Queue。 - **并发队列(ConcurrentQueue)**:线程安全的队列,允许多个线程同时进行读写操作。 - **优先级...

    目前项目在用性能稳定的线程池源码

    1. 初始化参数:线程池的大小(corePoolSize)、最大线程数(maximumPoolSize)、工作队列(BlockingQueue&lt;Runnable&gt; workQueue)以及超时策略等。这些参数会影响线程池的运行效率和稳定性。 2. 工作线程管理:...

    并发-线程池和阻塞队列

    阻塞队列(BlockingQueue)是Java并发包(java.util.concurrent)中的一个重要数据结构,它实现了队列的特性,同时具备线程安全的特性。当队列满时,添加元素的线程会被阻塞,直到队列有空位;当队列为空时,取出...

    自定义实现Java线程池

    TimeUnit unit, BlockingQueue&lt;Runnable&gt; workQueue) { if (coreThreadPool || coreThreadPool &gt; maxThreadPool || maxThreadPool || keepAliveTime ) throw new IllegalArgumentException("arg is illegal"); ...

    使用Vector实现简单线程池

    不过,实际生产环境中的线程池实现往往会选择更高效的数据结构,例如`BlockingQueue`,并配合`ExecutorService`的高级特性,如定时任务、工作队列大小控制等。 在实际项目中,使用标准库提供的`ExecutorService`和`...

    自定义实现Java线程池1-模拟jdk线程池执行流程1

    5. `workQueue`: 任务队列,用于存储等待执行的任务,通常使用`BlockingQueue`实现 构造函数接收这些参数,用于初始化线程池。同时,我们还检查参数的有效性,如确保核心线程数小于最大线程数,存活时间大于0等。 ...

    Android开发中线程池的使用Demo

    BlockingQueue&lt;Runnable&gt; workQueue = new LinkedBlockingQueue(100); // 任务队列,用于存放待执行的任务 ExecutorService executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, ...

    线程池示例代码

    `ThreadPoolExecutor`构造函数接收几个关键参数:核心线程数、最大线程数、存活时间、时间单位和工作队列(通常是`BlockingQueue&lt;Runnable&gt;`)。 1. **核心线程数**:线程池维护的最小线程数,即使在空闲时也会保留...

    java.util.concurrent 实现线程池队列

    BlockingQueue&lt;Runnable&gt; workQueue = new LinkedBlockingQueue(); ExecutorService executor = new ThreadPoolExecutor( corePoolSize, maximumPoolSize, keepAliveTime, TimeUnit.MILLISECONDS, workQueue); ``` ...

    线程池使用示例(含源代码)

    BlockingQueue&lt;Runnable&gt; workQueue = new LinkedBlockingQueue(100); ThreadFactory threadFactory = Executors.defaultThreadFactory(); RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy...

    java线程池的源码分析.zip

    2. **线程池参数**:线程池的构造函数通常接受四个参数:核心线程数(corePoolSize)、最大线程数(maximumPoolSize)、任务队列(BlockingQueue&lt;Runnable&gt; workQueue)和线程工厂(ThreadFactory threadFactory)。...

    基于线程池的WebServer

    5. **线程安全的数据结构**:在多线程环境中,如任务队列,需要使用线程安全的数据结构(如Java的`BlockingQueue`)来保证数据一致性。 6. **Web服务器基础**:理解HTTP协议的基本原理,包括请求方法(GET、POST等...

    JAVA线程池原理以及几种线程池类型介绍.doc

    线程池的实现通常基于工作队列,如Java中的`BlockingQueue&lt;Runnable&gt;`。当任务被提交到线程池时,会被添加到队列中,然后由空闲的线程取出并执行。这种设计利用了Java的并发工具类,如`wait()`和`notify()`,确保了...

Global site tag (gtag.js) - Google Analytics