For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
我们在前几期的文章中给大家简单介绍了零基础学习软件开发需要掌握的一些基础知识等内容,而本文我们就通过案例分析来了解一下,线程封装与任务执行分析。
一、线程怎么封装?线程放在哪个池子里?
线程,即是实现了Runnable接口,执行的时候,调用的是start()方法,但是start()方法内部编译后调用的是run()方法,这个方法只能调用一次,调用多次会报错。因此线程池里面的线程跑起来之后,不可能终止再启动,只能一直运行着。既然不可以停止,那么执行完任务之后,没有任务过来,只能是轮询取出任务的过程
线程可以运行任务,因此封装线程的时候,假设封装成为Worker,Worker里面必定是包含一个Thread,表示当前线程,除了当前线程之外,封装的线程类还应该持有任务,初始化可能直接给予任务,当前的任务是null的时候才需要去获取任务。
可以考虑使用HashSet来存储线程,也就是充当线程池的角色,当然,HashSet会有线程安全的问题需要考虑,那么我们可以考虑使用一个可重入锁比如ReentrantLock,凡是增删线程池的线程,都需要锁住。
二、线程怎么取得任务?
(1)初始化线程的时候可以直接指定任务,譬如RunnablefirstTask,将任务封装到worker中,然后获取worker里面的thread,thread.run()的时候,其实就是跑的是worker本身的run()方法,因为worker本身就是实现了Runnable接口,里面的线程其实就是其本身。因此也可以实现对ThreadFactory线程工厂的定制化。
(2)运行完任务的线程,应该继续取任务,取任务肯定需要从任务队列里面取,要是任务队列里面没有任务,由于是阻塞队列,那么可以等待,如果等待若干时间后,仍没有任务,倘若该线程池的线程数已经超过核心线程数,并且允许线程消亡的话,应该将该线程从线程池中移除,并结束掉该线程。
取任务和执行任务,对于线程池里面的线程而言,就是一个周而复始的工作,除非它会消亡。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。