线程池(1)

线程池[前言]:

  • 线程是宝贵的内存资源,单个线程约占1MB空间,过多分配易造成内存溢出。
  • 频繁的创建以及销毁线程会增加虚拟机回收频率,资源开销,造成程序性能下降。

线程池[概念]:

  • 线程容器,可设定线程分配的数量上限。
  • 将预先创建的线程对象存入线程池中,并重用线程池中的 线程对象。
  • 避免频繁的创建和销毁。

------ 创建线程池------

  • 常用的线程池接口和类都在(java.uti1.concurrent)包里面:

  • Executor: 线程池的顶级接口。
  • ExecutorService:线程池接口,可以通过submit(Runnable task)提交任务代码。
  • Executors:工具类:通过此类可以获取线程池(重点)。

以下通过Executors创建的线程池说明
newFixedThreadPool(int nThreads)获取固定数量的线程池。参数:指定线程池中线程的数量。
newCachedThreadPool()获得动态数量的线程池,线程数量由任务个数来决定的,没有上限。
newSingleThreadExecutor()创建单线程池 只有一个线程
newScheduledThreadPool()创建调度线程池 调度:周期,定时执行
根据下面代码分析
通用方法说明
es.submit(Runnable tas)提交任务 如:es.submit(runnable)
es.shutdown()等待所有任务执行完毕,后关闭线程池
es.shutdownNow()不等待,停止所有正在执行的任务,暂停处理正在等待任务,并返回等待执行的任务列表
根据下面代码分析

package dey01;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
//例子:买票
public class Executors_01 {
    public static void main(String[] args) {
        //1.1创建固定线程个数的线程池
        //     ExecutorService es =Executors.newFixedThreadPool(3);//固定3个线程
        //1.2创建动态线程池,线程数量是任务个数来决定的
        //     ExecutorService es = Executors.newCachedThreadPool();//任务数量来决定线程的个数
        //1.3创建单线程池    只有一个线程
        //     ExecutorService es = Executors.newSingleThreadExecutor();
        //1.4创建调度线程池 调度:周期,定时执行
        ExecutorService es = Executors.newScheduledThreadPool(3);
        //2.创建任务
        Runnable runnable = new Runnable() {
            private int t = 100;
            @Override
            public void run() {
                while(true){
                    if (t<=0) {
                        break;
                    }
                    System.out.println(Thread.currentThread().getName()+"买了第"+t+"张票");
                    t--;
                }
            }
        };
        //3.提交任务
        for (int i=0;i<4;i++) {//因为固定线程池有三个线程,所以循环三次
            es.submit(runnable);
        }
        //4.关闭线程池
        es.shutdown();//等待全部任务执行完毕后关闭线程池
        //es.shutdownNow();//不等待,停止所有正在执行的任务,暂停处理正在等待任务,并返回等待执行的任务列表
    }
}


代码看不清楚可以看:
在这里插入图片描述
在这里插入图片描述

补充:

package dey02;
import java.util.Calendar;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class Exe_03 {
    public static void main(String[] args) {
        ScheduledExecutorService es = Executors.newScheduledThreadPool(3);
        es.schedule(new Runnable() {
            @Override
            public void run() {
                System.out.println("时间1:" + Calendar.getInstance().getTime());
                System.out.println("   -   爆炸");
            }
        }, 5, TimeUnit.SECONDS);//TimeUnit.SECONDS(5)线程等待五秒
        es.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                System.out.print("时间2:"+Calendar.getInstance().getTime());
                System.out.println("   -   爆炸");
            }
        }, 5,2, TimeUnit.SECONDS);//TimeUnit.SECONDS(5)线程等待五秒
        /***************>>>es.scheduleAtFixedRate<<<*****************
         * command:执行的任务 Callable或Runnable接口实现类
         *
         * initialDelay:第一次执行任务延迟时间
         *
         * period:连续执行任务之间的周期,从上一个任务开始执行时计算延迟多少开始执行下一个任务,但是还会等上一个任务结束之后。
         *
         * unit:initialDelay和period时间单位
         */
        es.scheduleWithFixedDelay(new Runnable() {
            @Override
            public void run() {
                System.out.print("时间3:"+Calendar.getInstance().getTime());
                System.out.println("   -   爆炸");
            }
        }, 15,3, TimeUnit.SECONDS);//TimeUnit.SECONDS(5)线程等待五秒
        /***************>>>es.scheduleWithFixedDelay<<<*****************
         * command:执行的任务 Callable或Runnable接口实现类
         *
         * initialDelay:第一次执行任务延迟时间
         * 
         * period:连续执行任务之间的周期,从上一个任务全部执行完成时计算延迟多少开始执行下一个任务
         * 
         * unit:initialDelay和period时间单位
         */
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值