Executor接口以及扩展 线程的执行器

线程池机制分离了任务的创建和执行。使用线程池执行器,仅需实现Runnable对象,并将该对象交给执行器。执行器会使用线程池中的线程执行,避免额外的创建线程的开销。
    线程池执行器起到了维护和管理线程的作用,从而将程序员从繁重的线程管理任务中解放出来。
    从JDK1.5开始,Java并发库中引入了Executor框架。该框架包括接口Executor及其接口ExcutorService,以及实现了上面两个接口的类ThreadPoolExecutor。
    
    Executor 接口 :
        Executor接口的对象可以接收提交到线程池的Runnable任务。该接口实现了任务的提交和任务的执行分离。
        定义:
        void execute(Runnble command)
        该方法用于异步地(在未来某个时间)执行给定的Runnable对象。
        其使用方式如下:
        Executor excutor = ...;
        executor.execute(new RunnableTask1());
        使用executor不用显示地创建线程,也不用显式地调用线程的start()方法。
        大多情况下,Executor异步执行提交的Runnable对象,但是,也可以让Executor立即执行提交的任务。例如:
        class MyExecutor implements Executor{
            public void execute(Runnable r){
                r.run();    //直接调用run()方法
            }
        }

    ExecutorService 接口
        ExecutorService 接口从父类Executor接口继承。定义如下:
        public interface ExecutorService extends Executor
        ExecutorService接口提供了关闭线程池的shutdown()方法,关闭后线程池不再接收新的任务。
        
    ThreadPoolExecutor 类

        ThreadPoolExecutor类 可以用来创建一个线程池,定义如下:
        
        public class ThreadPoolExecutor extends AbstractExecutorService  它有四个构造方法:
            //创建一个线程池执行器对象,corePoolSize 为线程池中的线程数,maxmumPoolSize 为线程池中允许的最大线程数,keepAliveTime 为最长等待时间,unit是keepAliveTime参数的等待时间;workQueue为任务队列。
            1)ThreadPoolExecutor( int corePoolSize,int maxmumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable>workQueue)
            //handler 表示超出线程队列容量时执行的处理程序
            2)ThreadPoolExecutor( int corePoolSize,int maxmumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable>workQueue,RejectedExecutionHandler handler)
            //threadFactory 为创建新的线程时使用的工厂
            3)ThreadPoolExecutor( int corePoolSize,int maxmumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable>workQueue,ThreadFactory threadFactory)
            //
            4)ThreadPoolExecutor( int corePoolSize,int maxmumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable>workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler)
        ThreadPoolExecutor类的实例可以通过它的构造方法来创建,也可以通过工厂类 Executors的相关方法来创建。
        当创建了ThreadPoolExecutor 对象后,就可以将Runnable和Callable对象交给该线程池运行。每一个ThreadPoolExecutor都维护了一些基本信息,例如:已完成的线程数。

    Executors 工厂类
        工厂类里的静态方法。可以直接调用
        例如:
        //创建一个线程池,该线程池在需要时创建新的线程,而且会重复利用已经创建的线程,该线程池对于执行那些生命周期较短的异步任务有利于提高性能。
        ThreadPoolExecutor executor  = (ThreadPoolExecutor)Executors.newCacheThreadPool();

    ThreadPoolExecutor的使用:
        
        使用线程执行器处理没有返回值的线程
        
        demo 示例 :
        //线程工作类
        public class Worker implements Runnable{
            Worker(String name){
                Thread.currentThread().setName(name);
            }
            public void run(){
                System.out.println(Thread.currentThread().getName() + "正在努力完成自己的工作。");
                try{
                    Thread.sleep(1000);
                }catch(InterruptedException e){
                    e.printStackTrace();
                }
            }
        }
        //线程池类
        public class Employer{
            //创建线程池执行器
            ThreadPoolExecutor executor = (ThreadPoolExecutor)Executors.newCachedThreadPool();
            public void dispatch(Worker worker){
                System.out.println("雇主正在派遣工人到工作岗位上。");
                executor.execute(worker);
                System.out.println("活动的线程数为:" + executor.getActiveCount() );
                System.out.println("线程池的大小为:" + executor.getPoolSize() );
            }
            public void endWork(){
                executor.shutdown();
            }
        }
        //测试启动类
        public class Index{
            public static void main(String [] args){
                int workerNum = Runtime.getRuntime().availableProcessors();
                Employer employer = new Employer();
                for(int i =0; i<workerNum;i++){
                    Worker worker = new Worker("工人"+i);
                    employer.dispatch(worker);
                }
                employer.endWork();
            }    
        }

运行结果:

雇主正在派遣工人到工作岗位上。
pool-1-thread-1正在努力完成自己的工作。
活动的线程数为:1
线程池的大小为:1
雇主正在派遣工人到工作岗位上。
活动的线程数为:2
线程池的大小为:2
雇主正在派遣工人到工作岗位上。
pool-1-thread-2正在努力完成自己的工作。
活动的线程数为:3
线程池的大小为:3
雇主正在派遣工人到工作岗位上。
pool-1-thread-3正在努力完成自己的工作。
活动的线程数为:4
线程池的大小为:4
雇主正在派遣工人到工作岗位上。
pool-1-thread-4正在努力完成自己的工作。
活动的线程数为:5
线程池的大小为:5
雇主正在派遣工人到工作岗位上。
pool-1-thread-5正在努力完成自己的工作。
活动的线程数为:6
线程池的大小为:6
雇主正在派遣工人到工作岗位上。
pool-1-thread-6正在努力完成自己的工作。
活动的线程数为:7
线程池的大小为:7
pool-1-thread-7正在努力完成自己的工作。
雇主正在派遣工人到工作岗位上。
活动的线程数为:8
线程池的大小为:8
pool-1-thread-8正在努力完成自己的工作。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 时,会发生什么? 当一个 excutor 被 remove 时,它将从 Spark 集群中移除,并且该 excutor 上正在运行的任何任务都将被重新分配到其他可用的 excutor 上。这可能会导致一些性能下降,因为重新分配任务需要时间,但是 Spark 会尽力保证任务的平衡分配,以最大程度地减少性能下降的影响。 ### 回答2: 当执行者(executor)被移除(remove)时,意味着该执行者不再继续履行其职责或参与相关活动。 在具体的语境中,执行者可能指的是某个组织或公司中的职位或角色,该职位负责管理和指导团队的工作。如果执行者被移除,可能代表着该职位的消失或者由其他人接替。 另外,执行者也可以指的是计算机编程中的线程执行器executor),它负责执行程序中的任务。当一个线程执行器被移除,意味着它将不再参与任务执行。这可能是因为不再需要该线程执行器,或者被其他线程执行器替代。 总之,当执行者被移除时,这意味着他们的职责或参与活动的角色将会停止。具体的影响和后续措施取决于所涉及的领域和具体情况。 ### 回答3: 当执行器executor)被移除时,意味着该执行器将不再处于活动状态,不再参与任务执行执行器是一种负责处理和执行任务的实体,通常被用于多线程编程或异步操作中。 当执行器被移除时,可能产生以下几种情况。首先,可能是由于任务执行完成或取消导致执行器被移除。一旦任务完成或被取消,执行器的工作就会结束,不再需要继续存在。 另外,执行器可能会被移除是由于出现错误或异常。如果执行器执行任务的过程中遇到无法处理的错误或异常,系统可能会选择移除该执行器,以保证整个系统的稳定性和可靠性。 当执行器被移除时,需要确保已经处理和终结了该执行器所处理的任务。这意味着,所有的任务都已经正确执行完毕或取消,并释放了相关的资源,以避免可能的资源泄漏或内存溢出等问题。 在移除执行器之后,系统可能会重新配置新的执行器,以确保后续的任务能够得到执行。重新配置执行器可能涉及到对执行器的初始化和参数设置等工作,以满足不同任务的需求。 总之,当执行器被移除时,就意味着其执行任务的职责已经结束,需要进行相应的资源释放和后续的执行器配置工作,以保证系统的正常运行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值