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

A threadpool with limited cache

    博客分类:
  • java
 
阅读更多

     As we all know ,we use the Executors.newCachedThreadPool() to create a thread pool which will use the SynchronousQueue to cache  the  not yet execute task.Then we will come to a problem:The cache queue will cache more and more Task waiting to be execute through the threadpool cann't execute the task in time.Oh,then we will get a exception :"OutOfMemory".That a terrible thing.

 

    Then what can we do for that ? We are sure  that should be stopped. When that case appearances, there must be something wrong happened to your system,but we cann't let it go.We can do just like this:

 

 

 

import java.util.Date;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.RejectedExecutionException;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/** 
 * @author dengxiaoming  E-mail: xiaoming.deng@renren.com 
 * @version createtime:2011-9-13 下午07:41:29 
 * 
 */

public class ThreadPoolTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
	
		
		ArrayBlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(5);
		
		int end = 11;
		final AtomicInteger count = new AtomicInteger();
		
		ExecutorService service =  new ThreadPoolExecutor(0,5,
                 60L, TimeUnit.SECONDS,
                 queue,
                 new MyThreadFactory(),
                 new MyRejectedExecutionHandler());
		
		for(int i=0; i<end; i++) {
			System.out.println("start i:" + i);
			service.submit(new Runnable(){
				public void run() {
					try {
						Thread.sleep(100);
						System.out.println("0----------" + count.getAndIncrement());
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			});
			System.out.println("it's over ....");
		}
		
	}

	
	private static class  MyThreadFactory implements ThreadFactory{
		
		
		final ThreadGroup group;
        final AtomicInteger threadNumber = new AtomicInteger(1);
        final String namePrefix;
        final String nameSuffix = "]";
        final static String defaultThreadPoolName = "ThreadPool_Test_DefaultName";
        
        
        public MyThreadFactory(){
        	 this(defaultThreadPoolName);
        }

        public MyThreadFactory(String poolName) {
            SecurityManager s = System.getSecurityManager();
            group = (s != null) ? s.getThreadGroup() :
                                  Thread.currentThread().getThreadGroup();
            namePrefix = "ThreadPool_Test_" + poolName + " _Pool [Thread-";
        }

        public MyThreadFactory(String poolName, ThreadGroup threadGroup) {
            group = threadGroup;
            namePrefix = "ThreadPool_Test_" + poolName + "_Pool [Thread-";
        }

        public ThreadGroup getThreadGroup() {
            return group;
        }

        public Thread newThread(Runnable r) {
            Thread t = new Thread(group,
                                  r,
                                  namePrefix +
                                  threadNumber.getAndIncrement() +
                                  nameSuffix,
                                  0);
            t.setDaemon(true);
            if (t.getPriority() != Thread.NORM_PRIORITY)
                t.setPriority(Thread.NORM_PRIORITY);
            return t;
        }
		
		
	}
	
	private static class MyRejectedExecutionHandler implements RejectedExecutionHandler {

		@Override
		public void rejectedExecution(Runnable r, ThreadPoolExecutor executor) {
			//log the exception for error analysis
			System.out.println(new Date().toString() + "------ :reject the r.toString()  " + r.toString());
			throw new RejectedExecutionException();
		}
		
	}
	
}

 

 

Then after the waiting or running task number reached 10(5+5) you will get a RejectedExecution.

 

What should you do with those RejectedExecution is check your system and try to find out the reason .

 

 

分享到:
评论

相关推荐

    threadpool

    线程池(threadpool)是计算机程序中一种有效的多线程处理形式,它预先创建一组线程,待有任务需要执行时,从线程池中取出一个线程来执行任务,任务完成后,线程并不销毁,而是返回线程池等待下一次的任务分配。...

    threadPool的实现代码

    threadPool的实现代码

    ThreadPool

    标题中的"ThreadPool"指的是线程池,这是一个编程概念,特别是在多线程编程中非常关键。线程池是一种线程使用模式,它维护着一个工作线程的集合,用于执行一系列的任务。通过线程池,可以有效地管理和控制并发执行的...

    Boost threadpool优先级实例

    Boost库是C++编程语言中的一个流行开源库,提供了丰富的功能,其中包括线程池(Boost.Threadpool)模块。本文将深入探讨如何使用Boost库中的线程池来处理具有优先级的任务,以及普通任务的执行。 首先,我们需要...

    ThreadPool 线程池管理单元

    ThreadPool 线程池管理单元 带调用例子

    A class for implementing a thread with a message pump on it.

    A class for implementing a thread with a message pump on it. There is an example derived class and an example MFC application. The class itself does not require MFC执行一个弹出消息的线程

    python threadpool

    Python中的`threadpool`库是实现多线程处理任务的一种工具,它提供了一种方便的方式来组织和管理线程池,从而高效地并发执行大量任务。`threadpool`库并不是Python标准库的一部分,而是由第三方开发者提供的扩展。在...

    threadpool.rar

    threadpool线程池学习

    threadpool.tar.gz

    在"threadpool.tar.gz"压缩包中,包含两个文件:threadpool.cc和threadpool.h,它们很可能是实现线程池的源代码文件。这里我们将详细讨论C++11引入的线程库以及如何在Linux/MacOS平台上利用这些新特性构建线程池。 ...

    Pythonpython threadpool python多线程 Python语言基础

    【Python】python threadpool python多线程 Python语言基础 文件清单 └── threadpool-1.2.7 ├── CHANGELOG.txt ├── doc │ ├── api │ │ ├── class-tree.html │ │ ├── epydoc.css │ │...

    Tomat研究之ThreadPool

    主要类包括`ThreadWithAttributes`、`ControlRunnable`、`ThreadPool`、`MonitorRunnable`和`ThreadPoolListener`等,这些类构成了线程池的主要框架。 1. **`ThreadWithAttributes`**:这个类负责设置和获取线程...

    Threadpool

    线程池是多线程编程中的一个重要概念,它在Java和其他许多编程语言中都有广泛的应用。线程池的出现主要是为了提高系统资源的利用率、减少系统创建和销毁线程的开销,以及对并发任务进行有效管理和调度。...

    VC++ThreadPool程序

    本篇文章将围绕“VC++ ThreadPool程序”进行详细讲解,旨在帮助读者理解和掌握如何在VC++环境中构建和使用线程池。 线程池是一种线程使用模式,它预先创建一组线程,等待任务到来时分配给这些线程执行,而不是每次...

    C# ThreadPool 多线程 代码示例

    在.NET框架中,`ThreadPool`是一个非常重要的概念,它是一个预先初始化的线程集合,用于高效地执行异步任务。`ThreadPool`管理线程的创建和销毁,优化系统资源的使用,尤其适合处理大量短生命周期的任务。本示例将...

    ThreadPool-master.zip

    ThreadPool-master.zip这个压缩包很可能包含一个C++实现线程池的项目。 线程池的工作原理是:当有新的任务需要执行时,不会立即创建新的线程,而是从线程池中取出一个已经存在的线程来执行任务。如果线程池中的所有...

    threadpool_informationmcb_threadpool_c++threadpool_

    在标题"threadpool_informationmcb_threadpool_c++threadpool_"中,"informationmcb"可能代表信息管理和控制块,而"threadpool"显然是指线程池,"c++threadpool"则表明我们关注的是C++实现的线程池。 C++11引入了对...

Global site tag (gtag.js) - Google Analytics