`

java ThreadPool 线程池

阅读更多

线程池的参数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());  
    }  
} 
 

 

分享到:
评论

相关推荐

    Java简单线程池 线程池中文文档

    简单的线程池程序+中文文档 包结构: com.tangkai.threadpool --SimpleThread.java 工作线程 --TestThreadPool.java 程序入口 --ThreadPoolManager.java 线程池管理类

    java自定义线程池应用

    ThreadPool 线程池类 DEFAULT_POOL_SIZE 默认线程池大小 threadPool 线程队列 taskQueue 任务队列 poolSize 自定义线程池大小 通过构造启动该线程池,调用addTask 方法将task任务传入,线程池会自动分配线程去执行...

    java线程池threadpool简单使用源码

    Java线程池(ThreadPool)是Java并发编程中的一个重要概念,它可以帮助我们有效地管理和控制并发执行的任务,从而提高系统的效率和稳定性。线程池通过复用已存在的线程,避免了频繁创建和销毁线程带来的开销,同时也...

    Java版线程池ThreadPool.zip

    Java线程池(ThreadPool)是Java并发编程中的一个重要概念,它是多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池可以有效控制运行的线程数量,如果线程数量超过了最大数量,...

    Java实现通用线程池

    Java 实现通用线程池 Java 实现通用线程池是指使用 Java 语言编写一个通用的线程池,线程池通俗的描述就是预先创建若干空闲线程,等到需要用多线程去处理事务的时候去唤醒某些空闲线程执行处理任务,这样就省去了...

    Java8并行流中自定义线程池操作示例

    在这篇短文中,我们将看一下 Stream API的最大限制,同时看一下如何让并行流和线程池实例(ThreadPool instance)一起工作。 知识点:Java8引入了流的概念,流是作为一种对数据执行大量操作的有效方式。并行流可以被...

    创建Java程序中线程池的详解

    为了解决这些问题,Java 提供了线程池(ThreadPool)的概念。 线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。它预先创建了一定数量的线程,当任务到来时,可以立即...

    java threadpool

    Java线程池(ThreadPool) Java线程池ThreadPool是Java并发编程中的一种机制,允许开发者将任务提交到线程池中,并由线程池管理这些任务的执行。Java线程池的主要作用是:提高系统的响应速度、提高系统的可扩展性、...

    Java线程池文档

    Java代码中展示的`ThreadPool`类是作者实现的一个简单线程池示例,使用了`LinkedList`作为工作队列,`ThreadPool`类继承了`ThreadGroup`,这在JDK 1.4版本中是一种常见实现方式。但在JDK 1.5及以上版本,推荐使用`...

    线程池ThreadPool

    线程池ThreadPool。

    Java ThreadPool:简单的Java线程池-开源

    Java ThreadPool是一个Java框架,它使用户可以将问题分解为有限数量的子问题,以异步方式执行每个子问题,并将每个子问题的结果合并为最终问题的最终结果。 将问题划分为子问题,并将子问题的结果组合为初始问题的...

    JAVA 自定义线程池的最大线程数设置方法

    JAVA 自定义线程池的最大线程数设置方法 JAVA 自定义线程池的最大线程数设置方法是指在创建线程池时,设置线程池的最大线程数,以确保线程池的高效运行。线程池的最大线程数设置方法主要取决于任务的类型,即CPU...

    JAVA线程池的原理与实现.pdf

    Java线程池是一种高效利用系统资源、管理并发执行任务的机制。它的原理是通过预先创建一组线程,这些线程在任务到来时可以立即执行,而不是每次需要执行任务时都新建线程,从而降低了线程创建和销毁带来的开销。...

    node-threadpool:使用工作线程的节点线程池

    节点线程池 警告:该项目主要是实验性项目,API可能会发生变化。 该软件包使用节点10.5的新辅助线程API实现线程池(请参阅: : )... 如果您熟悉Java的线程池API,则应该非常熟悉: import { Executors } from "nod

    在spring boot中使用java线程池ExecutorService的讲解

    1. 线程池管理器(ThreadPool):用于创建并管理线程池,包括创建线程池,销毁线程池,添加新任务。 2. 工作线程(PoolWorker):线程池中线程,在没有任务时处于等待状态,可以循环的执行任务。 3. 任务接口(Task...

    Java线程池.docx

    Java线程池 Java线程池是Java语言中的一种高级多线程处理机制,用于避免重复创建和销毁线程而导致额外的性能开销。Java线程池功能可以实现线程的复用,提高了系统的性能和效率。 Java线程池分类 Java线程池可以...

    ThreadPool:java线程池的写法

    线程池 java线程池的写法 这个类展示了在java中实现ThreadPool的一种方式! 您可以轻松阅读源文件,因为注释很详细。 尽情享受吧!

    两种线程池写法

    ThreadPoolManager:Executors.newFixedThreadPool(num * 2);// 创建一个可重用固定线程数的线程池,以共享的无界队列方式来运行这些线程 threadPool: 线程池 创建线程池,销毁线程池,添加新任务

    线程池threadpool_src

    Java中的`java.util.concurrent.ThreadPoolExecutor`就是一种常见的线程池实现,它提供了丰富的参数和方法来定制线程池的行为,如核心线程数、最大线程数、线程存活时间、任务队列类型等。 通过分析和理解“线程池...

    Java手写线程池的实现方法

    Java手写线程池的实现方法 Java手写线程池的实现方法是指通过编写 Java 代码来实现一个线程池,线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。线程池线程都是后台...

Global site tag (gtag.js) - Google Analytics