多语言展示
当前在线:1369今日阅读:86今日分享:14

java多线程的简单写作(Exexctor框架)

多线程程序是一个后端程序员必须需要学会的一个技能,也是程序写作中的一大难点,本篇文章适合已经了解基本的多线程程序规则,想要更快更好地写出高效率的多线程程序的读者。尚未了解多线程的,可以先去看看多线程的基础原理。
工具/原料
1

eclipes

2

java jdk

方法/步骤
1

首先,先让我们来了解一下Exexctor多线程框架的常用接口和子类:Executor:是用来接收多线程中的runnable方法的;ExecutorService:是前者(Executor)的子类接口,但是适用面更广;AbstractExecutorService:是前者(ExecutorService)执行方法的默认实现;ScheduledExecutorService:Scheduled,顾名思义,这个接口是做定时调度用的;ScheduledThreadPoolExecutor:前者(ScheduledExecutorService)的实现,没什么好说的;ThreadPoolExecutor:线程池,保存线程的地方。ps:ThreadPoolExecutor这个是调用Executors方法,而返回值是ExecutorService对象!!!切记是ExecutorService对象而不是Executor对象,本人被坑过很多次!!!下面将对各个方法进行简单介绍以及小例子的使用。

2

下面这个就是ThreadPoolExecutor方法的具体调用方式了,需要注意的有:1.后两个参数是可选的,也就是不填也是ok的。2.corePoolSize这个参数是核心线程数,也就是这个系统的最少线程数,及时用不到这么多线程,他也会创建这么多。3.maximumPoolSize是最大线程数,也就是这个系统允许的最多线程数,和上面的最小线程数一起规定了总线程的多少。即以下这个公式:***corePoolSize <运行的线程数< maximumPoolSize

3

4.keepAliveTime,线程的存活时间。当现在运行的线程数大于最小线程数的时候,当一个线程存活时间到这个keepAliveTime的时候,这个线程就会被关闭。5.unit,是keepAliveTime的单位,就是是按纳秒,微秒,毫秒,秒这类的计量单位。6.workQueue,这个是阻塞队列,这个是操作系统的相关知识,不多做解释。如果读者现在不太了解操作系统的就绪、阻塞、运行的状态,我的建议还是先去学习操作系统的相关知识再来做多线程,这样会容易理解很多。7.threadFactory,线程工厂,顾名思义,创建新线程的地方。8.handle,处理,就是处理线程的地方啦。

4

ok,ThreadPoolExecutor讲过了,下面大家再来了解一下重要的Executors方法,这个方法提供了大量的静态工厂,来创建各种各样不同功能的线程。由于这是初学教程,我就只简单的介绍两种最常用的方法。

5

1.newFixedThreadPool方法,这个方法是创建固定数目,且可以重复使用的线程,也就是一开始说要创建比如5个,那么无论何时,无论发生什么样的情况,都有且只有5个线程,任务比5个多,那就堆在那,任务比5个少,那线程即使是闲着也不会取消。反正就这5个工人,活多多少,都是5个,不会变的。

6

2.newSingleThreadExecutor方法,这个方法比较有趣,在这个方法下,如果一个线程执行一个任务到一半,然后这个线程异常关闭了,那么就会自动生成一个新的线程,继续执行这个任务。我比较喜欢把这个线程成为:愚公移山线程,毕竟线程的关闭大多数都是因为线程寿命到了,而后被系统关闭的。

7

说了这么多理论,想必大家会有些枯燥,我这里来举一个计时器的小例子,来和大家更为深刻的理解下Exexctor框架的基本知识。

8

这里我们采用了上述的“愚公移山”进程,还有我们的定时调度功能,也就是5秒后我们的计时器开始“滴答”,之后每三秒执行一次“滴答”,保证这个一直能执行下去的,使我们的newSingleThreadExecutor方法,而能保证这个每三秒执行一次的,则是我们的ScheduledExecutorService定时调度功能。这短短的十行代码,包含了上面和大家讲的很多知识,而且这个框架是不是也觉得用起来很简单呢?读者如果对这个框架感兴趣的话可以留言,或者是深入去研究,必能有所收获。

注意事项
1

尚未了解java以及多线程基础的,建议先去了解相关知识。

2

本篇只是Exexctor的简单介绍,起到抛砖引玉的作用,需要具体使用的,可以去查询官方的文档,进行深入学习

推荐信息