线程池创建线程异步获取Future超时

这篇具有很好参考价值的文章主要介绍了线程池创建线程异步获取Future超时。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

ExecutorService executorServer = xxxxxx.getThreadPool();

Future future = executorServer.submit(new xxxxxxx(Param, funcId));


 Object obj = future.get(100, TimeUnit.MILLISECONDS); //总超时时间设置

其中,future.get是从开始进行get方法时进行计算的时间,非future生成开始计算的,即什么时候get什么时候开始计时。

线程池从生成线程,如果核心线程不为0,则有任务时一直生成核心线程,直至到核心线程,之后开始方队列中,最后任务多就开始开辟新线程到最大线程数。

执行任务时,首先线程池开辟线程,之后 线程start( execute方法->addWorker-->t.start())后开始执行call方法。但从.start 到 执行call方法,需要CPU进行线程的上下文切换。 可以根据重写的

ThreadPoolExecutor方法来跟踪。

在高并发下,如果线程池不加 executorServer.prestartAllCoreThreads();

则在线程为1500的并发下,即新创建线程start状态为NEW,真正运行时为RUNNABLE(start后),到call真正的调用会耗时,因CPU切换。

如不加,则会有12-160多ms的消耗,

如果加上prestartAllCoreThreads()则性能会好很多,最大从start到call才3ms.

同时,如使用hutool-all-5.3.8.jar的ThreadUtil.execAsyn方法效果也比较好,但没有restartAllCoreThreads()这个好,测试效果有9-14ms的消耗。

public static ThreadPoolExecutor getThreadPool() {
if (executorServer == null || executorServer.isShutdown() || executorServer.isTerminated()) {
			synchronized (JzPreCheckUtil.class) {
				if (executorServer == null || executorServer.isShutdown() || executorServer.isTerminated()) {
					XxxConfig.isJzPrecheckEnabled(); //加载相关配置
					log.info("corePoolSize="+XxxConfig.corePoolSize+"  maximumPoolSize="+XxxConfig.maximumPoolSize+" keepAliveTime="+XxxConfig.keepAliveTime);
					ThreadFactory threadFactory = new ThreadFactory() {
						@Override
						public Thread newThread(Runnable r) {
							long t1=System.currentTimeMillis();
							String threadName="jzThreadPool" + r.hashCode();
							Thread newThread=new Thread(r, threadName);
							long t2=System.currentTimeMillis();
							log.info("创建线程="+threadName+" t1="+t1+"  t2="+t2+"  时间差="+(t2-t1));
							return newThread;
						}
					};

				
					executorServer = new ThreadPoolExecutor(XxxConfig.corePoolSize, XxxConfig.maximumPoolSize, XxxConfig.keepAliveTime, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(),threadFactory);
					executorServer.prestartAllCoreThreads();

					log.info("prestartAllCoreThreads 之后="+executorServer.getQueue().size()+"  线程活着的数量="+executorServer.getActiveCount()+
							"  核心线程="+executorServer.getCorePoolSize()+"  最大线程="+executorServer.getMaximumPoolSize()+
							"  线程数="+executorServer.getPoolSize());
					
				}
			}
		}	
		log.info("queue 长度  后="+executorServer.getQueue().size()+"  线程活着的数量="+executorServer.getActiveCount()+
				"  核心线程="+executorServer.getCorePoolSize()+"  最大线程="+executorServer.getMaximumPoolSize()+
				"  线程数="+executorServer.getPoolSize());

		return executorServer;
	}
   @Override
    public Object call() throws Exception {
      
        xxx
        return out;
      
    }

重写文章来源地址https://www.toymoban.com/news/detail-430489.html

ThreadPoolExecutor参考:
package com.stock.framework.precheck.test2;

import com.stock.framework.jzprecheck.JzConfig;
import org.slf4j.Logger;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantLock;

public class MyThreadPool2 extends ThreadPoolExecutor {

    private static final int COUNT_BITS = Integer.SIZE - 3;
    private static final int CAPACITY   = (1 << COUNT_BITS) - 1;
    private static final int RUNNING    = -1 << COUNT_BITS;
    private static final int SHUTDOWN   =  0 << COUNT_BITS;
    private static final int STOP       =  1 << COUNT_BITS;
    private static final int TIDYING    =  2 << COUNT_BITS;
    private static final int TERMINATED =  3 << COUNT_BITS;

    public static Logger log = XXConfig.log;

    public MyThreadPool2(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
    }

    public MyThreadPool2(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);
    }

    public MyThreadPool2(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, RejectedExecutionHandler handler) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, handler);
    }

    public MyThreadPool2(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
    }

    public MyThreadPool2 getThreadPool(){

      //  return XXXXUtil.getMyThreadPool();

        return null;
    }

    @Override
    public void execute(Runnable command) {

        log.info("execute-11="+System.currentTimeMillis());
        if (command == null){
            throw new NullPointerException();
        }


        /*
         * Proceed in 3 steps:
         *
         * 1. If fewer than corePoolSize threads are running, try to
         * start a new thread with the given command as its first
         * task.  The call to addWorker atomically checks runState and
         * workerCount, and so prevents false alarms that would add
         * threads when it shouldn't, by returning false.
         *
         * 2. If a task can be successfully queued, then we still need
         * to double-check whether we should have added a thread
         * (because existing ones died since last checking) or that
         * the pool shut down since entry into this method. So we
         * recheck state and if necessary roll back the enqueuing if
         * stopped, or start a new thread if there are none.
         *
         * 3. If we cannot queue task, then we try to add a new
         * thread.  If it fails, we know we are shut down or saturated
         * and so reject the task.
         */
        AtomicInteger ctl=getCtl();
        int c = ctl.get();
        if (workerCountOf(c) < getCorePoolSize()) {
            if (addWorker(command, true))
                return;
            c = ctl.get();
        }
        log.info("execute-22="+System.currentTimeMillis());
        BlockingQueue<Runnable> workQueue= (BlockingQueue<Runnable>) getPrivateValue(null,"workQueue");

        if (isRunning(c) && workQueue.offer(command)) {
            int recheck = ctl.get();
            if (! isRunning(recheck) && remove(command))
                reject(command);
            else if (workerCountOf(recheck) == 0)
                addWorker(null, false);
        }
        else if (!addWorker(command, false))
            reject(command);
    }

    public void reject(Runnable command) {
        RejectedExecutionHandler handler= (RejectedExecutionHandler) getPrivateValue(null,"handler");;
        handler.rejectedExecution(command, this);
    }

    public int runStateOf(int c)     { return c & ~CAPACITY; }

    boolean isRunning(int c) {
        return c < SHUTDOWN;
    }


    private boolean compareAndIncrementWorkerCount(int expect) {
        AtomicInteger ctl=getCtl();
        return ctl.compareAndSet(expect, expect + 1);
    }

    public Object getInstance(Object instance,String className,Object object) throws ClassNotFoundException, IllegalAccessException, InvocationTargetException, InstantiationException {

        Class<?> enclosingClass = Class.forName(className);
        Constructor constructor = enclosingClass.getDeclaredConstructors()[0];

        constructor.setAccessible(true);
        return  constructor.newInstance(instance,object);
    }
    public  Object getPrivateValue(Object obj ,String propName) {
        Object value = null;
        try {

            // 通过属性获取对象的属性
            //.getDeclaredFields() 获得某个类的所有声明的字段,即包括public、private和proteced但不包括父类申明字段
            //.getClass() 是?个对象实例的?法,只有对象实例才有这个?法,具体的类是没有的

            Field field = obj.getClass().getDeclaredField(propName);
            // 对象的属性的访问权限设置为可访问
            //允许获取实体类private的参数信息
            field.setAccessible(true);
            // 获取属性的对应的值
            value = field.get(obj);
        } catch (Exception e) {
            e.printStackTrace();
            log.error(e.toString());
            return null;
        }
        return value;
    }

    public boolean addWorker(Runnable firstTask, boolean core) {
        log.info("addWorker-1="+System.currentTimeMillis());

        retry:
        for (;;) {
            AtomicInteger ctl=getCtl();
            int c = ctl.get();
            int rs = runStateOf(c);

            BlockingQueue<Runnable> workQueue= (BlockingQueue<Runnable>) getPrivateValue(null,"workQueue");

            // Check if queue empty only if necessary.
            if (rs >= SHUTDOWN &&
                    ! (rs == SHUTDOWN &&
                            firstTask == null &&
                            ! workQueue.isEmpty()))
                return false;
            log.info("addWorker-retry-1="+System.currentTimeMillis());
            for (;;) {
                log.info("addWorker-retry-2="+System.currentTimeMillis());
                int wc = workerCountOf(c);
                if (wc >= CAPACITY ||
                        wc >= (core ? getCorePoolSize() : getMaximumPoolSize()))
                    return false;
                if (compareAndIncrementWorkerCount(c))
                    break retry;
                c = ctl.get();  // Re-read ctl
                if (runStateOf(c) != rs)
                    continue retry;
                // else CAS failed due to workerCount change; retry inner loop
            }
        }

        log.info("addWorker-Worker-="+System.currentTimeMillis());
        boolean workerStarted = false;
        boolean workerAdded = false;
       // Worker w = null;
        Object w=null;
        try {
           // w = new Worker(firstTask);

            w = getInstance(getThreadPool(),"java.util.concurrent.ThreadPoolExecutor$Worker",firstTask);

            //final Thread t = w.thread;
            final Thread t =  (Thread)getPrivateValue(w,"thread");

            log.info("addWorker-t-="+System.currentTimeMillis());
            if (t != null) {
                ReentrantLock mainLock11= (ReentrantLock) getPrivateValue(null,"mainLock");
                final ReentrantLock mainLock = mainLock11;
                log.info("addWorker-lock-="+System.currentTimeMillis());
                mainLock.lock();
                try {
                    // Recheck while holding lock.
                    // Back out on ThreadFactory failure or if
                    // shut down before lock acquired.
                    AtomicInteger ctl=getCtl();
                    int rs = runStateOf(ctl.get());

                    if (rs < SHUTDOWN ||
                            (rs == SHUTDOWN && firstTask == null)) {
                        if (t.isAlive()) // precheck that t is startable
                            throw new IllegalThreadStateException();

                        HashSet workers= (HashSet) getPrivateValue(null,"workers");
                        workers.add(w);

                        int s = workers.size();
                        if (s > getLargestPoolSize()){
                           // largestPoolSize = s;
                            setPrivateValue(null,"largestPoolSize",s);
                        }

                        workerAdded = true;
                    }
                } finally {
                    mainLock.unlock();
                }
                log.info("addWorker-workerAdded="+workerAdded+"   "+System.currentTimeMillis());
                if (workerAdded) {
                    log.info("addWorker-t.start()= start before 状态="+t.getState()+"  优先级别="+t.getPriority()+"  "+System.currentTimeMillis());

                    t.start();
                    log.info("addWorker-t.start()= start after 状态="+t.getState()+"  优先级别="+t.getPriority()+"  "+System.currentTimeMillis());

                    workerStarted = true;
                }
            }
        } catch (InstantiationException e) {
            log.error(e.toString());
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            log.error(e.toString());
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            log.error(e.toString());
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            log.error(e.toString());
            e.printStackTrace();
        } finally {
            if (! workerStarted)
            {
                log.info("!workerStarted-t-="+System.currentTimeMillis());
                // addWorkerFailed(w);
                getPrivateMethodValue(getThreadPool(),"addWorkerFailed",w);

            }

        }
        return workerStarted;
    }

    

    private void decrementWorkerCount() {
        do {} while (! compareAndDecrementWorkerCount(getCtl().get()));
    }
    private boolean compareAndDecrementWorkerCount(int expect) {
        return getCtl().compareAndSet(expect, expect - 1);
    }

    public AtomicInteger getCtl() {

        /*if(executorServer==null){
            // executorServer = JzPreCheckUtil.getThreadPool();
            executorServer   = getThreadPool();
        }*/
        AtomicInteger ctl= (AtomicInteger) getPrivateValue(getThreadPool(),"ctl");
        return ctl;
    }



    int workerCountOf(int c)  { return c & CAPACITY; }


    public  Object getPrivateValue(ThreadPoolExecutor executorServer ,String propName) {
        Object value = null;
        try {
            if(executorServer==null){

                // executorServer = JzPreCheckUtil.getThreadPool();
                executorServer = getThreadPool();
            }
            // 通过属性获取对象的属性
            //.getDeclaredFields() 获得某个类的所有声明的字段,即包括public、private和proteced但不包括父类申明字段
            //.getClass() 是?个对象实例的?法,只有对象实例才有这个?法,具体的类是没有的

            Field field = executorServer.getClass().getSuperclass().getDeclaredField(propName);
            // 对象的属性的访问权限设置为可访问
            //允许获取实体类private的参数信息
            field.setAccessible(true);
            // 获取属性的对应的值
            value = field.get(executorServer);
        } catch (Exception e) {
            log.error(e.toString());
            e.printStackTrace();
            return null;
        }
        return value;
    }


    public  void setPrivateValue(ThreadPoolExecutor executorServer, String propName,Object value) {

        try {
            if(executorServer==null){
                // executorServer = JzPreCheckUtil.getThreadPool();
                executorServer = getThreadPool();
            }
            // 通过属性获取对象的属性
            //.getDeclaredFields() 获得某个类的所有声明的字段,即包括public、private和proteced但不包括父类申明字段
            //.getClass() 是?个对象实例的?法,只有对象实例才有这个?法,具体的类是没有的
            Field field = executorServer.getClass().getSuperclass().getDeclaredField(propName);
            // 对象的属性的访问权限设置为可访问
            //允许获取实体类private的参数信息
            field.setAccessible(true);
            // 获取属性的对应的值
            field.set(executorServer,value);

        } catch (Exception e) {
            log.error(e.toString());
            e.printStackTrace();

        }
    }


    

    public Object getPrivateMethodValue(Object obj, String propName,Object val) {
        //Object value = null;
        try {
            Class c = obj.getClass().getSuperclass();

            // https://blog.csdn.net/qq_34626094/article/details/122687833
            //getDeclaredMethod java.lang.NoSuchMethodException的异常原因在于调用getDeclaredMethod时要同时指定方法名和参数名,这两个不能错误。
            Method method = c.getDeclaredMethod(propName,val.getClass());
            method.setAccessible(true);
            Object[] values = new Object[1];
            values[0] = val;
            return method.invoke(obj,values);
        } catch (Exception e) {
            log.error(e.toString());
            return null;
        }
    }
}

到了这里,关于线程池创建线程异步获取Future超时的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 异步编程 - 04 基于JDK中的Future实现异步编程(上)_Future & FutureTask 源码解析

    这里我们主要探讨如何使用JDK中的Future实现异步编程,这包含 如何使用FutureTask实现异步编程及其内部实现原理; 如何使用CompletableFuture实现异步编程及其内部实现原理, 以及CompletableFuture与JDK Stream如何完美结合的。 在Java并发包(JUC包)中Future代表着异步计算结果,Future中

    2024年02月09日
    浏览(24)
  • 【并发编程】线程池多线程异步去分页调用其他服务接口获取海量数据

    前段时间在做一个数据同步工具,其中一个服务的任务是调用A服务的接口,将数据库中指定数据请求过来,交给kafka去判断哪些数据是需要新增,哪些数据是需要修改的。 刚开始的设计思路是,,我创建多个服务同时去请求A服务的接口,每个服务都请求到全量数据,由于这些

    2024年02月13日
    浏览(31)
  • java多线程异步处理并获取处理后的返回值

    示例部分代码:

    2024年02月06日
    浏览(32)
  • 单线程、同步、异步、预解析、作用域、隐式全局变量、对象创建、new

    cpu 资源分配的最小单位 一个进程可以有多个线程 cpu 调度的最小单位 线程建立在进程的建立基础上的一次程序的运行单位 线程分为:单线程 多线程 单线程:js是单线程 (同一个时间只能完成一个任务) 多线程:百度是多线程 同步任务是指在主线程上排队的任务,只有当前

    2024年01月22日
    浏览(31)
  • 【linux c多线程】线程的创建,线程信息的获取,获取线程返回值

    ​ 专栏内容 : 参天引擎内核架构 本专栏一起来聊聊参天引擎内核架构,以及如何实现多机的数据库节点的多读多写,与传统主备,MPP的区别,技术难点的分析,数据元数据同步,多主节点的情况下对故障容灾的支持。 手写数据库toadb 本专栏主要介绍如何从零开发,开发的

    2024年02月04日
    浏览(26)
  • 异步编程 - 06 基于JDK中的Future实现异步编程(中)_CompletableFuture源码解析

    CompletableFuture实现了CompletionStage接口 。 1)一个CompletionStage代表着一个异步计算节点,当另外一个CompletionStage计算节点完成后,当前CompletionStage会执行或者计算一个值;一个节点在计算终止时完成,可能反过来触发其他依赖其结果的节点开始计算。 2)一个节点(CompletionStag

    2024年02月09日
    浏览(26)
  • 从 Future 到 CompletableFuture:简化 Java 中的异步编程

    在并发编程中,我们经常需要处理多线程的任务,这些任务往往具有依赖性,异步性,且需要在所有任务完成后获取结果。Java 8 引入了 CompletableFuture 类,它带来了一种新的编程模式,让我们能够以函数式编程的方式处理并发任务,显著提升了代码的可读性和简洁性。 在这篇

    2024年02月11日
    浏览(27)
  • 并发编程 | 从Future到CompletableFuture - 简化 Java 中的异步编程

    在并发编程中,我们经常需要处理多线程的任务,这些任务往往具有依赖性,异步性,且需要在所有任务完成后获取结果。Java 8 引入了 CompletableFuture 类,它带来了一种新的编程模式,让我们能够以函数式编程的方式处理并发任务,显著提升了代码的可读性和简洁性。 在这篇

    2024年02月13日
    浏览(35)
  • 多线程系列(十九) -Future使用详解

    在前几篇线程系列文章中,我们介绍了线程池的相关技术,任务执行类只需要实现 Runnable 接口,然后交给线程池,就可以轻松的实现异步执行多个任务的目标,提升程序的执行效率,比如如下异步执行任务下载。 而实际上 Runnable 接口并不能满足所有的需求,比如有些场景下

    2024年03月14日
    浏览(37)
  • C++11并发与多线程笔记(10) future其他成员函数、shared_future、atomic

    status = result.wait_for(std::chrono::seconds(几秒)); 卡住当前流程,等待std::async()的异步任务运 行一段时间,然后返回其状态std::future_status 。如果std::async()的参数是std::launch::deferred(延迟执行),则不会卡住主流程。 std::future_status是枚举类型,表示异步任务的执行状态。类型的取值

    2024年02月12日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包