`
heipark
  • 浏览: 2084948 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Executors.newFixedThreadPool和ArrayBlockingQueue一点使用心得

    博客分类:
  • Java
 
阅读更多

newFixedThreadPool使用范例:

 

 

 

import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Test {

	public static void main(String[] args) throws IOException, InterruptedException {
		ExecutorService service = Executors.newFixedThreadPool(2);
		for (int i = 0; i < 6; i++) {
			final int index = i;
			System.out.println("task: " + (i+1));
			Runnable run = new Runnable() {
				@Override
				public void run() {
					System.out.println("thread start" + index);
					try {
						Thread.sleep(Long.MAX_VALUE);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("thread end" + index);
				}
			};
			service.execute(run);
		}
	}
}

 

 输出:
task: 1
task: 2
thread start0
task: 3
task: 4
task: 5
task: 6
task: 7
thread start1
task: 8
task: 9
task: 10
task: 11
task: 12
task: 13
task: 14
task: 15

 

    从实例可以看到for循环并没有被固定的线程池阻塞住,也就是说所有的线程task都被提交到了ExecutorService中,查看 Executors.newFixedThreadPool()如下:

 

 

public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}

    可以看到task被提交都了LinkedBlockingQueue中。这里有个问题,如果任务列表很大,一定会把内存撑爆,如何解决?看下面:

 

 

import java.io.IOException;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Test {

	public static void main(String[] args) throws IOException, InterruptedException {
		
		BlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(3);
		
		ThreadPoolExecutor executor = new ThreadPoolExecutor(3, 3, 1, TimeUnit.HOURS, queue, new ThreadPoolExecutor.CallerRunsPolicy());
		
		for (int i = 0; i < 10; i++) {
			final int index = i;
			System.out.println("task: " + (index+1));
			Runnable run = new Runnable() {
				@Override
				public void run() {
					System.out.println("thread start" + (index+1));
					try {
						Thread.sleep(Long.MAX_VALUE);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println("thread end" + (index+1));
				}
			};
			executor.execute(run);
		}
	}
}

 

 输出:
task: 1
task: 2
thread start1
task: 3
task: 4
task: 5
task: 6
task: 7
thread start2
thread start7
thread start6

 

    线程池最大值为4(??这里我不明白为什么是设置值+1,即3+1,而不是3),准备执行的任务队列为3。可以看到for循环先处理4个task,然后把3个放到队列。这样就实现了自动阻塞队列的效果。记得要使用ArrayBlockingQueue这个队列,然后设置容量就OK了。

 

--heipark

 

 

 

 

 

 

 

分享到:
评论
1 楼 liyf_324 2012-11-15  
好帖           

相关推荐

    JAVA集中常用的线程池比较共8页.pdf.zip

    除了这些预定义的工厂方法,还可以直接使用`ThreadPoolExecutor`构造函数,自定义更复杂的配置,例如设置工作队列类型(如`ArrayBlockingQueue`、`LinkedBlockingQueue`或`SynchronousQueue`)和拒绝策略(如`...

    java线程实例 各种小Demo

    - Executors.newFixedThreadPool(int nThreads):创建固定大小的线程池,线程数量不会改变。 - Executors.newSingleThreadExecutor():创建单线程的线程池,所有任务都在唯一的工作线程中按顺序执行。 - Executors....

    java线程池实例

    在实际开发中,Java还提供了一些预定义的线程池,如`Executors.newFixedThreadPool(int nThreads)`创建固定大小的线程池,`Executors.newSingleThreadExecutor()`创建只有一个线程的线程池等。这些预定义的线程池...

    java多线程和并发

    - **固定线程池**:`Executors.newFixedThreadPool(int nThreads)`,创建固定数量线程的线程池。 - **单线程池**:`Executors.newSingleThreadExecutor()`,确保所有任务都在同一个线程中顺序执行。 - **缓存...

    第7章-JUC多线程v1.1.pdf

    ExecutorService newFixedThreadPool = Executors.newFixedThreadPool(5); 和创建单一线程池类似, 不同的是线程池中有多个线程, 可以并行处理任务, 若多个线程任务被提交到此线程池, 会有以下执行过程: 如果...

    java定时器\多线程(池)\java队列Demo

    ExecutorService executor = Executors.newFixedThreadPool(poolSize); executor.execute(new Runnable() { @Override public void run() { // 执行任务的代码 } }); executor.shutdown(); // 关闭线程池 ``` #...

    java多线程例子-生产者消费者

    4. **启动线程**:最后,我们需要创建并启动生产者和消费者线程,可以使用`ExecutorService`和`newFixedThreadPool`创建线程池。 ```java ExecutorService executor = Executors.newFixedThreadPool(2); executor....

    BlockingQueue队列自定义超时时间取消线程池任务

    ExecutorService executor = Executors.newFixedThreadPool(5); BlockingQueue&lt;FutureTask&gt; taskQueue = new ArrayBlockingQueue(100); public void submitTask(Callable&lt;?&gt; callable, long timeout, TimeUnit unit...

    生产者消费者问题

    ExecutorService executor = Executors.newFixedThreadPool(NUM_THREADS); executor.execute(new Producer(queue)); executor.execute(new Consumer(queue)); ``` 5. **关闭线程池**:在所有任务完成后,记得关闭...

    ThreadPoolManager_线程池管理

    - 避免使用`Executors.newFixedThreadPool(nThreads)`创建线程池,因为它使用的是无界LinkedBlockingQueue,可能导致内存溢出。 - 定期监控线程池状态,及时调整线程池大小。 - 使用完线程池后确保调用`shutdown...

    java操作系统生产者消费者问题模拟

    ExecutorService executor = Executors.newFixedThreadPool(2); executor.execute(new Producer(queue)); executor.execute(new Consumer(queue)); // 当不再需要生产或消费时,关闭线程池 // executor....

    java多线程学习笔记

    - **使用ExecutorService**:通过Executor框架创建线程池,如`ExecutorService executor = Executors.newFixedThreadPool(10);` 2. **线程的启动与生命周期** - **start()方法**:调用Thread对象的start()方法...

    多线程实例片段

    ExecutorService executor = Executors.newFixedThreadPool(5); executor.execute(new MyTask()); // 提交任务到线程池 executor.shutdown(); // 关闭线程池 ``` 在实际开发中,工具库如Apache Commons Lang的`...

    java模拟阻塞队列

    ExecutorService executor = Executors.newFixedThreadPool(2); // 提交生产者和消费者线程到线程池 executor.execute(producer); executor.execute(consumer); // 关闭线程池 executor.shutdown(); } } ``...

    Consumer_Producer_Exercise

    ExecutorService executor = Executors.newFixedThreadPool(2); // 生产者线程 Runnable producer = () -&gt; { for (int i = 0; i ; i++) { try { // 添加数据到队列,如果队列已满,则阻塞 queue.put(i); ...

    定制化线程池实现高并发数据处理.zip

    - 避免频繁地创建和销毁线程池,可以使用`Executors`的`newFixedThreadPool`、`newSingleThreadExecutor`等静态方法创建常用类型的线程池。 - 不推荐使用`Executors.newCachedThreadPool`,因为它会无限制地创建新...

    Java concurrency线程池之线程池原理(二)_动力节点Java学院整理

    Java并发编程中的线程池是高效管理并发任务的关键工具,它可以帮助我们优化系统资源的使用,避免过度创建和销毁线程导致的性能开销。在Java中,`java.util.concurrent`包提供了`ExecutorService`接口及其实现类`...

    producer_consumer_using_multithreading_in_java:用Java实现的经典生产者消费者问题的多线程解决方案

    ExecutorService executor = Executors.newFixedThreadPool(numProducers + numConsumers); executor.execute(new Producer(blockingQueue)); executor.execute(new Consumer(blockingQueue)); // ...重复提交更多...

    Java 线程池详解及创建简单实例

    5. `workQueue`: 工作队列,用于存储待执行的任务,常见的有`ArrayBlockingQueue`、`LinkedBlockingQueue`和`PriorityBlockingQueue`等。 6. `threadFactory`: 线程工厂,用于创建线程,可以自定义线程的命名、线程...

    线程:Java多线程编程核心技术_完整版书上代码

    ExecutorService executor = Executors.newFixedThreadPool(5); executor.execute(new Runnable() {...}); executor.shutdown(); ``` 线程通信: Java提供了多种线程间通信的方法,如wait()、notify()和notifyAll()...

Global site tag (gtag.js) - Google Analytics