课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
线程池是程序员在开发软件的时候会经常用到的一个编程技术,下面我们就通过案例分析来了解一下,线程封装与线程状态类型。
线程怎么封装?线程放在哪个池子里?
线程,即是实现了Runnable接口,执行的时候,调用的是start()方法,但是start()方法内部编译后调用的是run()方法,这个方法只能调用一次,调用多次会报错。因此线程池里面的线程跑起来之后,不可能终止再启动,只能一直运行着。既然不可以停止,那么执行完任务之后,没有任务过来,只能是轮询取出任务的过程
线程可以运行任务,因此封装线程的时候,假设封装成为Worker,Worker里面必定是包含一个Thread,表示当前线程,除了当前线程之外,封装的线程类还应该持有任务,初始化可能直接给予任务,当前的任务是null的时候才需要去获取任务。
可以考虑使用HashSet来存储线程,也就是充当线程池的角色,当然,HashSet会有线程安全的问题需要考虑,那么我们可以考虑使用一个可重入锁比如ReentrantLock,凡是增删线程池的线程,都需要锁住。
线程有哪些状态?
现在我们所说的是Java中的线程Thread,一个线程在一个给定的时间点,只能处于一种状态,这些状态都是虚拟机的状态,不能反映任何操作系统的线程状态,一共有六种/七种状态:
NEW:创建了线程对象,但是还没有调用Start()方法,还没有启动的线程处于这种状态。
Running:运行状态,其实包含了两种状态,但是Java线程将就绪和运行中统称为可运行
Runnable:就绪状态:创建对象后,调用了start()方法,该状态的线程还位于可运行线程池中,等待调度,获取CPU的使用权
只是有资格执行,不一定会执行
start()之后进入就绪状态,sleep()结束或者join()结束,线程获得对象锁等都会进入该状态。
CPU时间片结束或者主动调用yield()方法,也会进入该状态
Running:获取到CPU的使用权(获得CPU时间片),变成运行中
BLOCKED:阻塞,线程阻塞于锁,等待监视器锁,一般是Synchronize关键字修饰的方法或者代码块
WAITING:进入该状态,需要等待其他线程通知(notify)或者中断,一个线程无限期地等待另一个线程。
TIMED_WAITING:超时等待,在指定时间后自动唤醒,返回,不会一直等待
TERMINATED:线程执行完毕,已经退出。如果已终止再调用start(),将会抛出java.lang.IllegalThreadStateException异常。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。