Zoey's Studio.

java基础--多线程部分-线程相关概念

2019/03/01 Share

技术规范

一些奇怪的并发bug的根源是什么?我们编写并发程序的时候需要注意什么?
计算机的发展历史中,cpu,内存和io设备都在不断的发展进化,但是有一个核心的矛盾是一直存在的,那就是这三者之间的速度差异是巨大的。程序的性能取决于系统中最慢的部分,所以我们需要协调这三者的速度。计算机体系结构、操作系统和编译程序都做出了一些贡献……

  • cpu增加了缓存,均衡与内存的速度差异。 —- 》 可见性问题(不可见)

  • 操作系统增加了多进程和多线程,以分时复用cpu(切换线程),提高了cpu的利用率也提高了IO的利用率 —》原子性问题(不按照我们的想法原子了)

  • 编译程序优化指令执行次序,使缓存能够更加合理的利用上。 —》有序性问题(不按照我们的想法有序了)在引入了新的技术,势必会带来一些问题,并发编程相关的bug和这三者的优化有关。

创建线程的方式?
创建线程有两种方式,本质都是重写run方法。

  • 继承Thread类
  • 实现Runnable接口,创建Thread对象,并传入实现了Runnable接口的类

启动线程的方式?start方法和run方法的区别?
启动线程需要调用start方法,调用后,操作系统会为线程分配相关的资源,并将这个线程作为一个独立的单元进行调度,分配时间片,执行的起点就是run方法。如果直接调用run方法,不会创建新的线程,而是在原来的线程执行run方法的逻辑。


线程的优先级是什么?如何设置?
线程的优先级是线程的一个属性,可以设置1-10的优先级,默认是5。但实际编程中不应该依赖优先级,因为优先级对操作系统而言是一种建议和提示,而不是强制的。


线程有什么状态?
JAVA源码中,线程的状态是一个枚举State,包含6种状态。

  • 线程刚被创建,start启动以前,状态为NEW
  • 调用start后,进入Runnable状态
  • 线程执行结束后,进入Terminated状态
  • BLOCKING WAITING 和 TIMEWAITING状态都是在等待某个条件

你知道线程的中断吗?谈谈你对中断的理解?
中断是java提供的用于线程取消或终止的协作机制,中断并不是强制终止线程,而是给线程传递一个信号,具体怎么关闭和何时关闭是由线程决定的。


关于中断有什么方法?
中断的方法都在Thread类中,主要有三个。

  • interupt():实例方法,由其他线程调用
  • isInterrupted():实例方法,判断线程的中断标志位是否为true
  • interrupted():静态方法,也是判断当前线程的中断标志位是否为true,但是会清空该标志位(变为false)

中断对线程有什么影响 或者说 线程是如何响应中断的?
中断对线程的影响主要可以从线程的状态和IO操作两大块来分析。
首先分析线程的状态。

  • Runnable状态时,并且线程没有在等待IO操作时(我们以前的理解,调用阻塞API时线程会进入阻塞状态,其实这个是操作系统层面的状态,对于JVM来说,线程的状态还是Runnable),调用interrupt方法,只会设置线程的标志位为true。作为线程来说,需要在合适的位置检测是否被中断来得到通知。
  • BLOCKED状态时(这种状态只会出现在synchronized关键字没有获取到锁时),调用interrupt方法,只会设置中断标记位,线程的状态也不会改变,这个是synchronized关键字局限的地方。
  • WAITING或TIME_WAITING状态时,调用interrupt方法,等待线程会抛出InterruptException异常,并且中断标记位被清空,线程状态重新变成Runnable。
  • NEW/TERMINATED状态,调用interrupt方法没有任何反应,也不会设置标记位。

然后分析IO操作。

  • 如果通道是可中断的,中断标记位被设置,并抛出ClosedByInterruptException异常。
  • 如果是阻塞在Selector选择器上,中断标记位会被设置,并且阻塞的调用立即返回。

什么是守护线程?
守护线程是辅助作用的,比如垃圾回收线程就是辅助线程。在程序中只剩下守护线程时,程序会退出。


你使用过什么线程分析工具?
https://www.cnblogs.com/happy-rabbit/p/6232581.html


CATALOG
  1. 1. 技术规范