首页 > 编程语言 >Java四种线程池

Java四种线程池

时间:2022-10-20 19:38:03浏览次数:47  
标签:Java Executors 创建 任务 线程 执行 public 四种

1,线程池的作用 
线程池作用就是限制系统中执行线程的数量。 
根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果。 

2,为什么要用线程池? 
(1).减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。 
(2).可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存

3,比较重要的几个类和描述

ExecutorService  真正的线程池接口。

ScheduledExecutorService  能和Timer/TimerTask类似,解决那些需要任务重复执行的问题。

ThreadPoolExecutor  ExecutorService的默认实现。

ScheduledThreadPoolExecutor  继承ThreadPoolExecutor的ScheduledExecutorService接口实现,周期性任务调度的类实现。

4,new Thread的弊端

  (1).每次new Thread新建对象性能差。 
  (2).线程缺乏统一管理,可能无限制新建线程,相互之间竞争,及可能占用过多系统资源导致死机或oom。 
  (3).缺乏更多功能,如定时执行、定期执行、线程中断。 
相比new Thread,Java提供的四种线程池的好处在于: 
 (1).重用存在的线程,减少对象创建、消亡的开销,性能佳。 
 (2).可有效控制最大并发线程数,提高系统资源的使用率,同时避免过多资源竞争,避免堵塞。 
 (3).提供定时执行、定期执行、单线程、并发数控制等功能。

 

5,四种线程池 

Java通过Executors提供四种线程池,分别为: 
1,newCachedThreadPoo 
创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 
2,newFixedThreadPool 
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 
3,newScheduledThreadPool 
创建一个定长线程池,支持定时及周期性任务执行。 
4,newSingleThreadExecutor 
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

 

6,创建四种线程池 示例

  (1),newCachedThreadPool 

   创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程, 那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。

 1 package io.ymq.thread.demo1;
 2  
 3 import java.util.concurrent.ExecutorService;
 4 import java.util.concurrent.Executors;
 5  
 6 /**
 7  * 描述: 创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。
 8  * 此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。
 9  *
10  * @author yanpenglei
11  * @create 2017-10-12 11:13
12  **/
13 public class TestNewCachedThreadPool {
14     public static void main(String[] args) {
15         ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
16         for (int i = 1; i <= 10; i++) {
17             final int index = i;
18             try {
19                 Thread.sleep(index * 1000);
20             } catch (InterruptedException e) {
21                 e.printStackTrace();
22             }
23  
24             cachedThreadPool.execute(new Runnable() {
25  
26                 @Override
27                 public void run() {
28                     String threadName = Thread.currentThread().getName();
29                     System.out.println("执行:" + index + ",线程名称:" + threadName);
30                 }
31             });
32         }
33     }
34 }

 (2),newFixedThreadPool 

  描述:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。 
线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。

package io.ymq.thread.demo2;
 
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
/**
 * 描述:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。
 * 线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。
 *
 * @author yanpenglei
 * @create 2017-10-12 11:30
 **/
public class TestNewFixedThreadPool {
 
    public static void main(String[] args) {
 
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
 
        for (int i = 1; i <= 10; i++) {
            final int index = i;
            fixedThreadPool.execute(new Runnable() {
 
                @Override
                public void run() {
                    try {
                        String threadName = Thread.currentThread().getName();
                        System.out.println("执行:" + index + ",线程名称:" + threadName);
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
 
                        e.printStackTrace();
                    }
                }
            });
        }
 
    }
}

(3),newScheduledThreadPool 
创建一个定长线程池,支持定时及周期性任务执行。延迟执行

package io.ymq.thread.demo3;
 
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
 
/**
 * 描述:创建一个定长线程池,支持定时及周期性任务执行。延迟执行
 *
 * @author yanpenglei
 * @create 2017-10-12 11:53
 **/
public class TestNewScheduledThreadPool {
 
    public static void main(String[] args) {
 
        ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(5);
 
        scheduledThreadPool.schedule(new Runnable() {
 
            @Override
            public void run() {
                System.out.println("表示延迟3秒执行。");
            }
        }, 3, TimeUnit.SECONDS);
 
 
        scheduledThreadPool.scheduleAtFixedRate(new Runnable() {
 
            @Override
            public void run() {
                System.out.println("表示延迟1秒后每3秒执行一次。");
            }
        }, 1, 3, TimeUnit.SECONDS);
    }
 
}

(4),newSingleThreadExecutor 
创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

package io.ymq.thread.demo4;
 
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
/**
 * 描述:创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
 *
 * @author yanpenglei
 * @create 2017-10-12 12:05
 **/
public class TestNewSingleThreadExecutor {
 
    public static void main(String[] args) {
        ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
        for (int i = 1; i <= 10; i++) {
            final int index = i;
            singleThreadExecutor.execute(new Runnable() {
 
                @Override
                public void run() {
                    try {
                        String threadName = Thread.currentThread().getName();
                        System.out.println("执行:" + index + ",线程名称:" + threadName);
                        Thread.sleep(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
    }
}

 

https://blog.csdn.net/achuo/article/details/80623893/

 

标签:Java,Executors,创建,任务,线程,执行,public,四种
From: https://www.cnblogs.com/zhaosq/p/14435812.html

相关文章

  • java---LocalDateTime
    packagejavasm.demo02;importjava.time.*;importjava.time.temporal.ChronoUnit;publicclassLocalDaTime{publicstaticvoidmain(String[]args){Loc......
  • .Net 线程
    一个应用程序中,必须有一个进程,一个进程可同时多个线程协作处理。同步:单线程,每一步都执行结束并返回结果,下一步处于等待,阻塞程序流异步:多线程,不需要等待执行结束,可继续执......
  • JAVA 进阶 69-79
    10/201.创建媒体类型了解父类与子类importjava.util.ArrayList;//导入包publicclasssfgda{//定义容器容器类型是DGSD这个类型privatestaticArrayList<DG......
  • Java开发必学知识合集(一)
    前言Java开发过程中,常用且重要的知识点是开发中最基本的,尤其是刚接触Java开发不久的开发者来说,基本功很重要,是直接做Java工作的基本,那么本文就来分享一下在Java开发过程中的......
  • java的decode_Java decode机试题
    java的decode_Javadecode机试题/****java编写encode方法和decode方法,机试题请你用java,c,c++*中任何一种语言实现两个函数encode()和decode(),分别实现对字符串的变......
  • JavaScript使用WebUploader做大文件的分块和断点续传
    ​ 之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上......
  • 项目开发神器VsCode配置指南!(含C++、Python、Java环境配置)
    作者:吴忠强,东北大学,Datawhale成员本篇文章虽然是VsCode挂名,但其实介绍了两款神器:Vscode和Vim,这两个结合起来,开发效率蹭蹭蹭!!!之前接触过VsCode但很少用。总感觉写Python......
  • Java关键字(二)——native
    本篇博客我们将介绍Java中的一个关键字——native。native关键字在JDK源码中很多类中都有,在Object.java类中,其getClass()方法、hashCode()方法、clone()方法......
  • 自学Java初学者的建议书
    基础  首选肯定的要明白java主要应用方向在哪,Java主要是用于web开发的。无论学习什么我们都知道,打好基础重要的重要性。但是Java的基础要想打扎实,并不是短时间内能做到的......
  • java爬虫之HtmlUnit介绍
    前端有时候会遇到项目临时需要网上收集数据的情况,什么方案是简单易懂、长期可用的呢,当然是用浏览器终端测试单元做爬虫是最方便的啦,将平时工作中的测试程序进行简单的修改......