• Android(Java)线程池:ExecutorService和Executors使用(二)


    一、固定大小的线程池,newFixedThreadPool:

    package Executor.test;
    
    import java.util.concurrent.ExecutorService;
    import java.util.concurrent.Executors;
    
    public class ExecutorTest {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            doExecutor();
        }
    
        static void doExecutor()
        {
            //create reuse,fix number,thread pool
            ExecutorService pool = Executors.newFixedThreadPool(5);
            //create threads
            Thread t1 = new Thread(new MyThread());
            Thread t2 = new Thread(new MyThread());
            Thread t3 = new Thread(new MyThread());
            Thread t4 = new Thread(new MyThread());
            Thread t5 = new Thread(new MyThread());
            //execute thread in thread pool
            pool.execute(t1);
            pool.execute(t2);
            pool.execute(t3);
            pool.execute(t4);
            pool.execute(t5);
            //shutdown thread pool
            pool.shutdown();
        }
        
        static class MyThread implements Runnable
        {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                System.out.println("running thread:"+Thread.currentThread().getName());
            }
        }
    }
    执行结果:

    running thread:pool-1-thread-1
    running thread:pool-1-thread-3
    running thread:pool-1-thread-5
    running thread:pool-1-thread-2
    running thread:pool-1-thread-4

    改变线程池的大小:

    ExecutorService pool = Executors.newFixedThreadPool(3)

    执行结果:

    running thread:pool-1-thread-1
    running thread:pool-1-thread-1
    running thread:pool-1-thread-1
    running thread:pool-1-thread-2
    running thread:pool-1-thread-3

    结论:从以上结果可以看出,newFixedThreadPool的参数指定了可以运行的线程的最大数目,超过这个数目的线程加进去以后,不会运行。其次,加入线程池的线程属于托管状态,线程的运行不受加入顺序的影响。

     二、单任务线程池,newSingleThreadExecutor:

    ExecutorService pool = Executors.newSingleThreadExecutor();

    result:

    running thread:pool-1-thread-1
    running thread:pool-1-thread-1
    running thread:pool-1-thread-1
    running thread:pool-1-thread-1
    running thread:pool-1-thread-1

    结论:每次调用execute方法,其实最后都是调用了thread-1的run方法。

    三、可变尺寸的线程池,newCachedThreadPool:

    ExecutorService pool = Executors.newCachedThreadPool();

    result:

    running thread:pool-1-thread-1
    running thread:pool-1-thread-2
    running thread:pool-1-thread-3
    running thread:pool-1-thread-4
    running thread:pool-1-thread-5

    结论:可根据需要创建新线程的线程池,但是在以前构造的线程可用时将重用它们。

    四、延迟连接池,newScheduledThreadPool:

    package Executor.test;
    
    import java.util.concurrent.Executors;
    import java.util.concurrent.ScheduledExecutorService;
    import java.util.concurrent.TimeUnit;
    
    public class ExecutorTest {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            doExecutor();
        }
    
        static void doExecutor()
        {
            //create scheduled thread pool
            ScheduledExecutorService pool = Executors.newScheduledThreadPool(3);
            //create threads
            Thread t1 = new Thread(new MyThread());
            Thread t2 = new Thread(new MyThread());
            Thread t3 = new Thread(new MyThread());
            Thread t4 = new Thread(new MyThread());
            Thread t5 = new Thread(new MyThread());
            //execute thread in thread pool
            pool.execute(t1);
            pool.execute(t2);
            //schedule method
            pool.schedule(t3, 1000, TimeUnit.MILLISECONDS);
            pool.schedule(t4, 2000, TimeUnit.MILLISECONDS);
            pool.schedule(t5, 3000, TimeUnit.MILLISECONDS);
            //shutdown thread pool
            pool.shutdown();
        }
        
        static class MyThread implements Runnable
        {
            @Override
            public void run() {
                // TODO Auto-generated method stub
                System.out.println("running thread:"+Thread.currentThread().getName());
            }
        }
    }

    result:

    running thread:pool-1-thread-1
    running thread:pool-1-thread-2
    running thread:pool-1-thread-3
    running thread:pool-1-thread-1
    running thread:pool-1-thread-2

    结论:运行结果可以看到,后面三条依次间隔一秒执行,起到定时周期执行任务的作用

    参考:Android的ExecutorService线程池 | 学步园

  • 相关阅读:
    [InnoSetup]Inno Setup软件打包脚本
    inno setup 执行SQL
    用inno Setup制作web项目安装包
    Inno Setup执行SQL脚本的方法
    delphi的tserversocket控件如何接收16进制数
    Delphi 通信报Asynchronous socket error 10053错误的一个解决方法
    么正矩阵(酉矩阵)
    对称矩阵、Hermite矩阵、正交矩阵、酉矩阵、奇异矩阵、正规矩阵、幂等矩阵
    RSVP协议的基本概念介绍
    计算机顶级会议的历年最佳文章
  • 原文地址:https://www.cnblogs.com/Android9527/p/5406957.html
Copyright © 2020-2023  润新知