线程池初学

线程池使用对象的概念,目的是减小对象的创建和注销的开支,减轻JVM(就是JAVA虚拟机)的压力。

newTread的弊端:
1.新建对象性能差;
2.线程之间缺乏统一管理,可能无限创建线程,相互之间竞争会带来过多的系统损耗,
到最后死机或者oom;
3.缺乏更多的功能,例如定时执行,定期执行,线程中断,可以基本理解为线程池扩展许多新功能;

所以说,如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间

Java可以通过Executors创建四中线程池,分别为:

1.newCachedThreadPool
创建一个可以缓存的线程池,可灵活回收空闲线程,若无可回收线程再穿件新线程
就是用多少拿多少;
2.newFixedThreadPool
创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待
3. newScheduledThreadPool
创建一个定长的线程池,支持定时即周期性任务执行
第一个参数是要操作的任务,第二个参数是要延迟的时间,第三个参数是延迟的时间的单位
4.newSingleThreadPool
创建一个单线程化的线程池,它只会用唯一 的工作线程来执行任务,保证所有 任务按照指定顺序执行

 Executor是一个顶层接口,在它里面只声明了一个方法execute(Runnable),返回值为void,参数为Runnable类型,从字面意思可以理解,就是用来执行传进去的任务的;然后ExecutorService接口继承了Executor接口,并声明了一些方法:submit、invokeAll、invokeAny以及shutDown等;抽象类AbstractExecutorService实现了ExecutorService接口,基本实现了ExecutorService中声明的所有方法;然后ThreadPoolExecutor继承了类AbstractExecutorService。

  所以execute()方法实际上是Executor中声明的方法,在ThreadPoolExecutor进行了具体的实现,这个方法是ThreadPoolExecutor的核心方法,通过这个方法可以向线程池提交一个任务,交由线程池去执行。

代码示例


public class MainActivity extends AppCompatActivity {
    /**
     * 线程池是一种对象池的概念,目的是减少对象的创建和注销的开支,减轻JVM(JAVA虚拟机)的压力
     *
     * 为什么使用线程池
     * newThread有很多弊端,
     * 1.新建对象性能差
     * 2.线程之间缺乏统一管理,可能无限创建线程,相互之间竞争会带来很多的系统损耗
     * 导致死机或者oom
     * 3.缺乏更多的功能,例如定时执行,定期执行,线程中断,可以基本理解为线程池扩展了很多功能
     *
     * JAVA可以通过Executors创建四种线程池
     * 1.newCachedThreadPool,创建一个可以缓存的线程池,可灵活回收空闲线程,若无可回收线程再穿件新线程
     * 就是用多少拿多少
     * @param savedInstanceState
     */

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

//        创建一个可缓存的线程池
//        ExecutorService Cachedpool = Executors.newCachedThreadPool();
//        for (int i = 0;i < 1000; i++){
//            final int index = i;
//            try {
//                Thread.sleep(1*1000);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//           给线程池添加任务
//            Cachedpool.execute(new Runnable() {
//                @Override
//                public void run() {
//                    Log.e("打印编号",""+index);
//                }
//            });
//        }

//        newFixedThreadPool
//        创建一个定长的线程,可控制线程的最大并发数,超出的线程会在队列等待
//        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(3);
//        for (int i = 0;i < 1000;i++){
//            final int index = i;
//
//            fixedThreadPool.execute(new Runnable() {
//                @Override
//                public void run() {
//                    try {
//                        Thread.sleep(index*1000);
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }
//                    Log.e("打印数据",""+index);
//                }
//            });
//        }


//        单线程线程池
//        newSingleThreadPool
//             ExecutorService singlepool = Executors.newSingleThreadExecutor();
//        for (int i = 0;i<10 ;i++){
//            final int index = i;
//            singlepool.execute(new Runnable() {
//                @Override
//                public void run() {
//                    try {
//                        Thread.sleep(2000);
//                        Log.e("数据打印",""+index);
//                    } catch (InterruptedException e) {
//                        e.printStackTrace();
//                    }
//                }
//            });
//        }

//        scheduledThreadPool
//        创建一个定长的线程池,支持定期和定时的任务执行,参数是最大线程数
          ScheduledExecutorService scheduledpool = Executors.newScheduledThreadPool(5);
//        延时操作  第一个参数是要操作的任务,第二个参数是要延迟的时间,第三个参数是延迟的时间的单位
//        scheduledpool.schedule(new Runnable() {
//            @Override
//            public void run() {
//                Log.e("打印","任务执行完毕");
//            }
//        },3, TimeUnit.SECONDS);

//        定时周期性任务
//        第一个参数是要执行的任务;第二个参数是延时时间;第三个参数是周期时间(每隔多长时间触发一次);第四个参数是时间的单位
        scheduledpool.scheduleAtFixedRate(new Runnable() {
            @Override
            public void run() {
                Log.e("打印","我在执行");
            }
        },1,5,TimeUnit.SECONDS);

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值