Java 多线程并发编程问题总结

多线程相关问题:

充分使用cpu 并发去做多个事情

单核cpu也适合利用多线程(如果是单线程的话,线程中需要等待IO时,cpu就空闲了也属于是一种浪费)

线程在阻塞状态,wait,await,sleep,等待IO,yield,结束了  会让出cpu

我认为线程是 一组代码的执行流,完成一组代码的执行  一组代码就可以相当与是一个任务

线程也并不是越多越好 1.线程在java中是一个对象,每一个java线程都需要操作系统线程支持,线程的创建和销毁都需要时间,如果创建时间+销毁时间>任务执行时间 ,就很不合算!

                                     2.java对象占用堆内存,操作系统占用系统内存,根据jvm规范 一个线程默认最大栈大小为1M,这个栈空间是需要从系统内存中分配的,线程过多会消耗很多内存,会造成栈溢出

                                     3.线程过多会造成cpu频繁切换线程上下文,影响性能

正确使用多线程就用到了线程池,由线程池来将合适数量的任务交给cpu去执行

合适数量:如果是计算型任务 那么建议设置成cpu核心数量的1-2倍 即可再多没用,  如果是IO密集型的 则需要多一些线程,要根据IO阻塞时间考量来决定 !如 tomcat  默认最大线程数为 200 

调节堆内存大小会影响可创建线程数 因为 堆内存调大也就会占用更多的系统内存 

线程生命周期及几个状态:

在线程的生命周期中,它要经过 新建(New)、就绪(Runnable)、运行(Running)、阻塞(Bolcked)、死亡(Dead)总共5种状态。

尤其在线程启动之后,它不可能一直占着CPU运行,所以CPU需要在多个线程之间相互切换,于是线程的状态也会多次在运行、阻塞之间切换。
1.新建状态(New):新创建了一个线程对象。
2.就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行线程池中,变得可运行,等待获取CPU的使用权。
3. 运行状态(Running):就绪状态的线程获取了CPU,执行程序代码。
4.阻塞状态(Blocked):阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。
阻塞的情况分三种:
(一)、等待阻塞:运行的线程执行wait()方法,JVM会把该线程放入等待池中。
(二)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入锁池中。
(三)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
5.死亡状态(Dead):线程执行完了或者因异常退出了run()方法,该线程结束生命周期。

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值