`
heipark
  • 浏览: 2094879 次
  • 性别: 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多线程实现.pdf

    3. ThreadPoolExecutor的使用和配置,它提供了对线程池行为的细致控制。 4. ReentrantLock的使用,提供了比synchronized更灵活的线程同步机制。 5. ServerSocket和Socket类在服务器端编程中的应用,以及如何使用...

    线程池之ThreadPoolExecutor.docx

    例如,创建一个固定大小的线程池可以使用`Executors.newFixedThreadPool(int nThreads)`,而创建一个按需增长的线程池可以使用`Executors.newCachedThreadPool()`。 线程池的配置需要根据实际应用的需求进行,包括...

    java线程实例 各种小Demo

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

    java线程池实例

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

    java多线程和并发

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

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

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

    一个线程池的设计

    上述设计中提到的`ThreadPoolManager`类可以通过继承`ThreadPoolExecutor`或者使用`Executors.newFixedThreadPool()`等工厂方法来实现。具体来说: - `ThreadPoolManager`可以通过配置最大和最小线程数、线程增长...

    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...

    java多线程加队列上传文件_后台处理

    1. **线程池**:使用`Executors`工具类创建线程池,例如`Executors.newFixedThreadPool(nThreads)`创建固定大小的线程池,其中`nThreads`为线程池中线程的数量。 2. **阻塞队列**:利用`BlockingQueue`接口实现的...

    生产者消费者问题

    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(); } } ``...

    米哈游笔试题目-Java方向.docx

    1. **队列实现**:可以使用`ArrayBlockingQueue`或`LinkedBlockingQueue`作为基础数据结构。 2. **插入和移除操作**:通过`offer`和`poll`方法来实现,这两个方法会在队列满或为空时返回`false`而不是阻塞。 3. **...

Global site tag (gtag.js) - Google Analytics