java Executors(线程池)

本文介绍了一个交通管理系统项目的实现细节,利用线程池技术实现车辆的自动添加与移除,通过单任务线程和延迟连接池控制车辆流量及信号灯变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   今天重新看了一次张孝祥老师的交通管理系统项目视频,发现里面有用到Executors,其实这个Executors就是一个线程池。

   线程池的思想就相当于对象池一样,它也是开辟了一块内存空间,里面存放那些(未死亡的)线程,该池中的线程执行调度由池管理器来处理,当从池中取出一个、执行完之后又回归池中。这样的好处就可以避免反复的创建线程对象所带来的性能开销,从而节省了系统的资源。

项目中用到两处线程池的内容,

1,Executors.newSingleThreadExecutor()  单任务线程,结合项目中的意思就是一个”路线“实例对象创建后就执行这个线程,达到不断(下面是1000)往车集合(vechicles)里添加车辆。

ExecutorService pool = Executors.newSingleThreadExecutor();  
        pool.execute(new Runnable(){  
            public void run(){  
                for(int i=1;i<1000;i++){  
                    try {  
                        Thread.sleep((new Random().nextInt(10) + 1) * 1000);  
                    } catch (InterruptedException e) {  
                        e.printStackTrace();  
                    }  
                    vechicles.add(Road.this.name + "_" + i);  //内部类访问外部类的变量,需要用类.this.变量<!--EndFragment-->
                }                 
            }
              
        }); 

2,Executors.newScheduledThreadPool(1);    延迟连接池,可以说是一个定时器,就是规定它隔个多少时间就执行一次,该参数(1)是表示池中所保存的线程数为1,方法参数解释timer.scheduleAtFixedRate(线程、开始时间、定时间隔时间、时间类型),结合项目中的意思就是如果车集合不为空,则每过一秒钟就把该集合的第一个元素删除,也就是说逐步把该路线上的车一辆一辆减少。

ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);  
        timer.scheduleAtFixedRate(  
                new Runnable(){  
                    public void run(){  
                        if(vechicles.size()>0){  
                            boolean lighted = Lamp.valueOf(Road.this.name).isLighted();  
                            if(lighted){  
                                System.out.println(vechicles.remove(0) + " is traversing !");  
                            }  
                        }  
                          
                    }  
                },  
                1,  
                1,  
                TimeUnit.SECONDS);

项目总结:其实该项目就是3块,一、是路线的类:首先随机不断的往路线车辆集合里添加车辆,然后每隔一秒判断是否为绿灯,是则把这个集合的第一个元素删除,不为绿灯就不变。二、灯的类,是一个枚举类,固定12个常量,也就是12个枚举类的实例对象,它们的有3个参数,(当前灯是否为绿、与当前灯同时为绿的对应方向、当前灯变红时下一个变绿的灯)。三、就是交通灯的管理,就是让一个方向的灯由绿变红,那它下一个方向的灯就变红,这样循环着。


### JavaExecutors 和 ThreadPoolExecutor 的区别 #### Executor 接口层次结构 `Executors` 并不是一个具体的线程池实现,而是提供了若干静态工厂方法来创建不同类型的线程池。这些线程池最终都是基于 `ThreadPoolExecutor` 实现的[^2]。 #### 创建方式的不同 - **Executors 工具类** 使用 `Executors` 类可以通过调用其提供的静态方法快速获得预定义配置好的几种常见类型线程池实例,比如固定大小、缓存型以及单一线程等特殊用途的线程池。 - **ThreadPoolExecutor 手动构建** 而如果想要更精细地控制线程池的行为,则可以直接使用 `ThreadPoolExecutor` 构造器来自定义核心线程数量、最大线程数量、保持活动时间、工作队列以及其他属性[^3]。 ```java // 使用 Executors 创建新固定的线程池 ExecutorService fixedPool = Executors.newFixedThreadPool(10); // 自定义 ThreadPoolExecutor 参数 ThreadPoolExecutor customPool = new ThreadPoolExecutor( 5, // 核心线程数 10,// 最大线程数 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>() ); ``` #### 配置灵活性对比 由于 `Executors` 返回的对象通常具有较为简单的内部逻辑设定,在某些复杂应用场景下可能无法完全满足需求;相反,直接操作 `ThreadPoolExecutor` 则能够给予开发者更大的自由度去调整各项参数以适应具体业务场景的要求[^4]。 #### 功能特性上的差异 除了基本的任务提交功能外,`ThreadPoolExecutor` 还支持更多高级特性的定制化选项,例如设置不同的拒绝策略处理超出容量范围之外的新任务请求,或是指定特定的工作队列类型影响任务排队机制等等[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值