日常的开发中,多线程非常常见了,为了提高生产效率或者高效完成任务,经常会采用多线程和并发运行方式。所谓并发,指在某个时间段内,多个任务交替处理的能力。所谓并行,是指同时处理多任务的能力。
并发和并行两者的主要区别是进程是否同时执行。
目前CPU已经发展多核,可以同时执行多个互不依赖的指令以及执行代码块。超市一个柜台收营员,一会儿要收钱,一会儿要帮客户包装东西,一会儿还要验收商品,可以说这个收营员就处于并发的状态。
从上面的例子能够看出来,并发情况可能会存在一些性能问题。
- 并发执行的程序之间有相互的制约关系,因为资源是有限的,有时候后一个程序的执行可能依赖前一个程序执行的结果。或者说多个程序都需要竞争计算资源。
- 并发程序执行时断断续续的,所谓并发,就是多个程序之间切换,某些程序肯定不可能一蹴而就,所以程序需要记忆现场指令以及上一次执行点。
- 并发执行程序还是有可能通过设置合理的调度策略来提升程序的运行效率。
线程概念:线程是CPU调度和分派的基本单位。为了充分利用CPU资源,会实现多程序来调度执行,提升程序执行效率。
线程可以拥有自己的操作栈、PC(程序计计数器)、局部变量表等,一个进程会有一个或者多个线程,同一个进程的线程共享进程的所有资源。
谈到线程,不得不谈到线程状态以及它们之间的切换。
这儿我觉得值得考察的点事线程状态之间切换的场景,会让你说下什么场景下从一个状态切换到另外一个状态。
- 线程Running状态:
- 直接切换到Dead状态:可能调用了stop(但是这个方法不建议使用,已经被废弃了),或者开发者直接加上了判断逻辑终止线程执行。
- 切换到Blocked状态:
1.调用了sleep方法。
2.调用了wait方法。
3.获取锁资源导致竞争锁进入阻塞状态。
4.IO耗时导致阻塞。- 切换到Runnable状态:
1.CPU执行时间片用完导致进入Runnable状态。
2.主动调用yield导致放弃CPU进入Runnable状态。
- 线程Blocked状态:
- 切换到Dead状态:
这种情况很少见,当Blocked的时候直接调用stop,但是基本上不用了,或者JVM发生crash导致终端退出了。- 切换到Runnable状态:
1.sleep执行结束
2.wait的线程被其他线程notify或者notifyAll唤醒。
3.线程竞争到锁进入Runnable状态。
4.IO耗时操作执行完成,进入Runnable状态。
希望能帮到大家,感谢。
《线程创建的基本方式》这篇文章总结的不错,学习学习。
网友评论