首页 > 编程语言 >java ThreadPool 线程池

java ThreadPool 线程池

时间:2023-04-20 16:07:31浏览次数:34  
标签:task java String System ThreadPool 线程 new


线程池的参数corePoolSize 为核心线程;maximunPoolSize为最大线程;

keepAliveTime为最长生命时间;unit是其时间单位;workQueue任务队列;

handler是过多线程之后的策略

对于线程池的处理线程机制,网上有一堆,但是机制核心是优先处理核心线程,优先堆满线程池,初学者建议不用轻易使用拒绝策略,除非是可容忍的线程

 

package com.test.second;

import java.util.concurrent.ArrayBlockingQueue;  
import java.util.concurrent.BlockingQueue;  
import java.util.concurrent.RejectedExecutionHandler;  
import java.util.concurrent.ThreadPoolExecutor;  
import java.util.concurrent.TimeUnit;  
import java.util.concurrent.atomic.AtomicLong;  
  
public class TimingThreadPool extends ThreadPoolExecutor {  
  
    public TimingThreadPool(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,  
            BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) {  
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);  
    }  
  
    private final ThreadLocal<Long> startTime = new ThreadLocal<Long>();  
    private final AtomicLong numTasks = new AtomicLong();  
    private final AtomicLong totalTime = new AtomicLong();  
  
    protected void beforeExecute(Thread t, Runnable r) {  
        super.beforeExecute(t, r);  
        System.out.println(String.format("Thread %s: start %s", t, r));  
        startTime.set(System.nanoTime());  
    }  
  
    protected void afterExecute(Runnable r, Throwable t) {  
        try {  
            long endTime = System.nanoTime();  
            long taskTime = endTime - startTime.get();  
            numTasks.incrementAndGet();  
            totalTime.addAndGet(taskTime);  
            System.out.println(String.format("Thread %s: end %s, time=%dns", t, r, taskTime));  
        } finally {  
            super.afterExecute(r, t);  
        }  
    }  
  
    protected void terminated() {  
        try {  
            System.out.println(String.format("Terminated: avg time=%dns", totalTime.get() / numTasks.get()));  
        } finally {  
            super.terminated();  
        }  
    }  
  
    private static class Task implements Runnable{  
  
        private String task;  
        public Task(String task){  
            this.task=task;  
        }  
          
        @Override  
        public void run() {  
            try {
                System.out.println(task);  
				Thread.sleep(2000);
	            if(task.equals("51")){  
	                throw new RuntimeException();  
	            } 
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} 
        }  
          
    }  
    public static void main(String[] args) throws Exception {  
        TimingThreadPool pool =  new TimingThreadPool(3, 4, 4, TimeUnit.SECONDS, new ArrayBlockingQueue<Runnable>(3),  
                new ThreadPoolExecutor.CallerRunsPolicy());  
        
        for (int i = 0; i < 5; i++) {  
            try {  
                // 产生一个任务,并将其加入到线程池  
                String task = "" + i;  
                System.out.println("put " + task);  
                pool.execute(new Task(task));  
  
                // 便于观察,等待一段时间  
                Thread.sleep(500);  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
        Thread.sleep(5000);  
        pool.shutdown();  
        System.out.println(pool.getTaskCount()+"   c:"+pool.getCompletedTaskCount());  
    }  
}

 

标签:task,java,String,System,ThreadPool,线程,new
From: https://blog.51cto.com/u_2465818/6209750

相关文章

  • java的synchronized
    不久前用到了同步,现在回过头来对JAVA中的同步做个总结,以对前段时间工作的总结和自我技术的条理话。JAVA中synchronized关键字能够作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。假如再细的分类,synchronized可作用于instance变量、objectreference(对象......
  • java 用ajax java后台传回值
       用ajaxjava后台传回值,包括传json publicstaticfinalvoidsendAsJson(HttpServletResponseresponse,Stringstr){response.setContentType("application/json;charset=UTF-8");if(null!=str)try{response.getWriter().write(st......
  • ArcGIS API for JavaScript 4.x加载GeoServer发布的WMTS服务
    前言 以前用OpenLayers加载GeoServer我记得很简单,现在用ArcGISAPI加载捣鼓了一天没搞好,第二天早上来参考一篇文章搞好了,我这纯属记录下。背景 客户没有ArcGISServer的许可,所以就只能用GeoServer发布或者离线切片,先研究下GeoServer,后面如果心情好再研究下离线切片。......
  • java EE开发之Servlet第十课:反射基础二
     ##一.反射类中的属性在Java中一切皆对象,那么类中任何一个属性都可以看做一个对象,一个属性对应一个Field对象####1.先建一个普通的类,写上不同修饰类型的属性publicclassStudent{ publicStringname; protectedintage; Stringsex; privatedoublemoney; publicstatic......
  • 【调试】Valgrind内存泄漏内存越界|运行时间|调用|cache命中率|多线程竞态|堆栈分析..
    目录即看即用详细简介Valgrind工具详解安装使用检测内存泄漏其他内存问题memcheck工具的常用选型其他选项附录其他类似工具实例分析:03.使用未初始化的内存04.使用野指针05.动态内存越界访问06.分配空间后没有释放07.不匹配使用delete或者free08.两次......
  • java 增删改查接口命名规范(service与mapper)
    阿里推荐命名规范:转载自:https://www.cnblogs.com/zengzy698/p/15939088.html......
  • JavaScript函数基础语法
    ●我们代码里面所说的函数和我们上学的时候学习的什么三角函数、二次函数之类的不是一个东西函数的概念●对于js来说,函数就是把任意一段代码放在一个盒子里面●在我想要让这段代码执行的时候,直接执行这个盒子里面的代码就行●先看一段代码//这个是我们以前写的一段代码for......
  • 在JAVA中怎么比较Double类型数据的大小?
    评:doublea=0.001;doubleb=0.0011;BigDecimaldata1=newBigDecimal(a);BigDecimaldata2=newBigDecimal(b);data1.compareTo(data2)非整型数,运算由于精度问题,可能会有误差,建议使用BigDecimal类型!publicintcompareTo(BigDecimalval)将此BigDecimal......
  • java守护进程
    评:1.所谓守护线程就是运行在程序后台的线程,程序的主线程Main(比方java程序一开始启动时创建的那个线程)不会是守护线程.2.Daemonthread在Java里面的定义是,如果虚拟机中只有Daemonthread在运行,则虚拟机退出。虚拟机中可能会同时有很多个线程在运行,只有当所有的非守护线程都......
  • java线程同步和异步的区别
    在Java中,同步和异步是指多线程并发执行中的两种不同的机制。同步指的是线程之间的协作方式,即当一个线程在执行一个任务时,其他线程必须等待该线程执行完该任务后才能执行同一段代码。同步机制通常使用synchronized关键字或Lock对象进行实现,以保证多线程共享的资源同步访问。 ......