executorservice 线程池_并发数与线程数

executorservice 线程池_并发数与线程数keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止。默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,直到线程池中的线程数不大于corePoolSize,即当线程池中的线程数大于corePoolSize时,如果一个线程空闲的时间达到keepAliveTime,则会终止,直到线程池中的线程数不超过corePoolSize。但…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

  • keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止。默认情况下,只有当线程池中的线程数大于corePoolSize时,keepAliveTime才会起作用,直到线程池中的线程数不大于corePoolSize,即当线程池中的线程数大于corePoolSize时,如果一个线程空闲的时间达到keepAliveTime,则会终止,直到线程池中的线程数不超过corePoolSize。但是如果调用了allowCoreThreadTimeOut(boolean)方法,在线程池中的线程数不大于corePoolSize时,keepAliveTime参数也会起作用,直到线程池中的线程数为0;
  • allowCoreThreadTimeOut默认是false,即核心线程不会超时关闭,除非手动关闭线程池才会销毁线程
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Main {
    public static void main(String[] args) {

        ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 10, TimeUnit.MILLISECONDS,
                new ArrayBlockingQueue<Runnable>(5), new ThreadPoolExecutor.CallerRunsPolicy());
        System.out.println("核心线程空闲超时是否关闭:" + executor.allowsCoreThreadTimeOut());//核心线程空闲超时是否关闭:false
        for (int i = 0; i < 15; i++) {
            MyTask myTask = new MyTask(i);
            executor.execute(myTask);
            System.out.println("线程池中线程数目:" + executor.getPoolSize() + ",队列中等待执行的任务数目:" +
                    executor.getQueue().size() + ",已执行完的任务数目:" + executor.getCompletedTaskCount());
        }
        executor.shutdown();//手动关闭线程池
        while (!executor.isTerminated()) {
        }
        if (executor.isTerminated()) {
            System.out.println("线程池中线程数目:" + executor.getPoolSize() + ",队列中等待执行的任务数目:" +
                    executor.getQueue().size() + ",已执行完的任务数目:" + executor.getCompletedTaskCount());
        }
    }
}

class MyTask implements Runnable {
    private int taskNum;

    public MyTask(int num) {
        this.taskNum = num;
    }

    @Override
    public void run() {
        System.out.println("线程名称:" + Thread.currentThread().getName() + ",正在执行task " + taskNum);
        try {
            Thread.currentThread().sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("task " + taskNum + "执行完毕");
    }
}

输出内容的最后是:线程池中线程数目:0,队列中等待执行的任务数目:0,已执行完的任务数目:15

allowCoreThreadTimeOut设置为true,不手动关闭

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Main {
    public static void main(String[] args) {

        ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 10, TimeUnit.MILLISECONDS,
                new ArrayBlockingQueue<Runnable>(5), new ThreadPoolExecutor.CallerRunsPolicy());
        System.out.println("核心线程空闲超时是否关闭:" + executor.allowsCoreThreadTimeOut());//核心线程空闲超时是否关闭:false
        executor.allowCoreThreadTimeOut(true);
        for (int i = 0; i < 15; i++) {
            MyTask myTask = new MyTask(i);
            executor.execute(myTask);
            System.out.println("线程池中线程数目:" + executor.getPoolSize() + ",队列中等待执行的任务数目:" +
                    executor.getQueue().size() + ",已执行完的任务数目:" + executor.getCompletedTaskCount());
        }
        
        while (true) {
            System.out.println("线程池中线程数目:" + executor.getPoolSize() + ",队列中等待执行的任务数目:" +
                    executor.getQueue().size() + ",已执行完的任务数目:" + executor.getCompletedTaskCount());
        }
    }
}

class MyTask implements Runnable {
    private int taskNum;

    public MyTask(int num) {
        this.taskNum = num;
    }

    @Override
    public void run() {
        System.out.println("线程名称:" + Thread.currentThread().getName() + ",正在执行task " + taskNum);
        try {
            Thread.currentThread().sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("task " + taskNum + "执行完毕");
    }
}

输出内容的最后是:线程池中线程数目:0,队列中等待执行的任务数目:0,已执行完的任务数目:15

allowCoreThreadTimeOut默认为false,不手动关闭

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.RejectedExecutionHandler;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Main {
    public static void main(String[] args) {

        ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 10, TimeUnit.MILLISECONDS,
                new ArrayBlockingQueue<Runnable>(5), new ThreadPoolExecutor.CallerRunsPolicy());
        System.out.println("核心线程空闲超时是否关闭:" + executor.allowsCoreThreadTimeOut());//核心线程空闲超时是否关闭:false
//        executor.allowCoreThreadTimeOut(true);
        for (int i = 0; i < 15; i++) {
            MyTask myTask = new MyTask(i);
            executor.execute(myTask);
            System.out.println("线程池中线程数目:" + executor.getPoolSize() + ",队列中等待执行的任务数目:" +
                    executor.getQueue().size() + ",已执行完的任务数目:" + executor.getCompletedTaskCount());
        }

        while (true) {
            System.out.println("线程池中线程数目:" + executor.getPoolSize() + ",队列中等待执行的任务数目:" +
                    executor.getQueue().size() + ",已执行完的任务数目:" + executor.getCompletedTaskCount());
        }
    }
}

class MyTask implements Runnable {
    private int taskNum;

    public MyTask(int num) {
        this.taskNum = num;
    }

    @Override
    public void run() {
        System.out.println("线程名称:" + Thread.currentThread().getName() + ",正在执行task " + taskNum);
        try {
            Thread.currentThread().sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("task " + taskNum + "执行完毕");
    }
}

输出内容的最后是:线程池中线程数目:5,队列中等待执行的任务数目:0,已执行完的任务数目:15

总结:

1 如果手动shutdown,则空闲线程数为0
2 如果allowCoreThreadTimeOut默认为false,不手动shutdown,则空闲线程数为是核心线程数

3 如果allowCoreThreadTimeOut设置为true,不手动shutdown,则空闲线程数为0

参考:

https://blog.csdn.net/u010002184/article/details/80847398
https://www.cnblogs.com/dolphin0520/p/3932921.html         Java并发编程:线程池的使用
https://blog.csdn.net/lmj623565791/article/details/27250059    Java并发专题 带返回结果的批量任务执行 CompletionService ExecutorService.invokeAll

executorservice 线程池_并发数与线程数

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/195375.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • export命令[通俗易懂]

    export命令[通俗易懂]export命令用于将shell变量输出为环境变量,或者将shell函数输出为环境变量。一个变量创建时,它不会自动地为在它之后创建的shell进程所知。而命令export可以向后面的shell传递变量的值。当一个shell脚本调用并执行时,它不会自动得到原为脚本(调用者)里定义的变量的访问权,除非这些变量已经被显式地设置为可用。export命令可以用于传递一个或多个变量的值到任何后继脚本。

    2022年9月7日
    0
  • 基于Auto.js的萌猫跳辅助

    基于Auto.js的萌猫跳辅助许久不见,甚是想念被学长唤醒的博客魂ing…这次是一个失去时效性的小脚本,但是其中包括一些东西或许对你们可以有帮助撒一些要点因为Auto.js并没有直接的对于触控位置的监听,所以需要对安卓API进行调用2.涉及对于画布的使用importClass(android.graphics.PorterDuffXfermode);importClass(android.graphics.PorterDuff);constBG_COLOR=colors.parseColor(“#2d

    2022年6月6日
    37
  • igmp应用_udp协议端口怎么测试

    igmp应用_udp协议端口怎么测试实验3:1)准备两台机,装linux系统。两机设置好IP后均运行routeadd-net224.0.0.0netmask224.0.0.0deveth0添加到组播组2)运行make编译3)A机运行./server4)B机运行./client服务端server.c代码如下:/**broadcast_server.c-多播服务程序*/#include#include#include#include……

    2022年9月14日
    0
  • idea最新激活码(破解版激活)「建议收藏」

    idea最新激活码(破解版激活),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    53
  • linux发邮件2种常见客户端命令[通俗易懂]

    linux发邮件2种常见客户端命令[通俗易懂]mail命令格式:mail-s”标题”邮件地址<文件echo”正文”|mail-s”标题”邮件地址例如:mail-s”liwen”1935845114@qq.com<hostsmutt命令mutt-s”标题”邮件地址<文件命令发邮件需要邮件服务的支持mail默认是调用本机MTA发送邮件的,这意味着需要在本机上安装sendmail或postfixCentos5默认使用Sendmail邮件服务,开启方式/etc/init.d…

    2022年10月20日
    0
  • vue富文本编辑器插件推荐_vue富文本编辑器的使用

    vue富文本编辑器插件推荐_vue富文本编辑器的使用vue富文本编辑器,插件

    2022年10月14日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号