线程的五种状态与线程池的知识点 Fromllengnuo

线程的五种状态
1.新建:当new操作符合创建一个线程时,例如new Thread(r),线程还没有开始运行。此时的线程处于新建的状态。程序还没有开始运行线程中的代码。

2.就绪:一个新创建的线程,并不自动开始运行。要执行线程,必须调用线程的start()方法。Start()方法创建运行的系统资源,并调度线程运行run()方法,当start()方法返回后,线程就处于就绪状态。处于就绪状态的线程并不一定立即运行run()方法。线程还必须同其他线程竞争cpu时间,只有获得cpu时间才可以运行线程。因为一个时刻只能运行一个线程,所以很多线程可能都处在于就绪状态。

3.运行:当线程进入cpu时间后,它才进入运行状态,真正开始执行run()方法。

4.阻塞:线程运行过程中可能进入阻塞的原因。1.可能通过调用sleep方法进入睡眠状态。2.线程在调用一个I/O上被阻塞的操作。该操作在输入输出操作完成之前不会返回到它的调用者。3.线程试图得到一个锁,而该锁正被其他线程持有。4.线程在等待某个触发条件。
所谓线程阻塞就是因为正在运行的线程没有运行结束,暂时让出了cpu,这时其他在就绪状态的线程就会可以获得cpu从而继续进入运行状态。

5.死亡:有两个原因导致线程死亡。一种是runn()方法正常退出而自然死亡。一种是未捕获的异常终止了run方法而使线程死亡。
为了确认线程在当前是否存活着,可以使用isAlive方法,如果是可运行或阻塞,则返回true,如果是在new状态且不不可运行,则返回false。

多线程的并发访问处理方式:可以使用synchronized和ThreadLocal两种方式处理。

Synchronized的处理方式是通过锁的形式与代码块绑定在一起,使得变量或代码块在某一时刻只能访问一个线程。Synchronized是用于线程间数据的共享。

ThreadLocal的处理方式是为每一个线程提供一个变量的副本,使得每一个线程在某一时间内访问到的并不是同一个对象。ThreadLocal是用于线程间的数据隔离。所以两者的区别是不同的。


线程池

线程池使用的原因:

减少线程的创建和销毁次数。可以重复使用线程,可执行多个任务。可以根据系统的承受能力,调整线程池中工作线程数量,防止因为消耗过多的内存,导致服务器崩溃。

线程池的分类:

线程池都是通过Executors来创建的。

1.newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。

2.NewFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。

3.NewScheduledThreadPool 创建一个定长线程池,支持定时及周期性执行任务

4.NewSingleThreadExecutorPool 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序执行。


停止和关闭线程池:

ThreadPoolExecutor提供了两个方法来关闭线程池,一个是shutdown() ,一个是shutdownNow()


Shutdown():不会立即终止线程池,当缓存队列中的任务运行完之后才会终止,而且不会再接收新的任务。

ShutdownNow():立即终止线程池,并且尝试打断正在运行的线程,清空缓存队列中的任务,返回尚未执行的任务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值