线程问题。

守护线程和用户线程的区别是什么?

  • 用户线程:运行在前台,执行具体的任务,如程序的主线程、连接网络的子线程等都是用户线程。
  • 守护线程:运行在后台,为其他前台线程服务。也可以说守护线程是JVM中非守护线程的“佣人”。一旦所有用户线程都结束运行,守护线程会随JVM一起结束工作。(属于是不求同年同月生,但求同年同月死)

如果Main函数所在的线程就是一个用户线程,Main函数启动的同时在JVM内部同时还启动了好多守护线程,比如垃圾回收线程,也比如Windows 下监听Ctrl+Break的守护进程。

需要注意以下几点:

  • 设置守护线程的方法setDaemon(true)必须要在线程启动start()前执,否则会抛出IllegalThreadStateException 异常。
  • 在守护线程中产生的新线程也是守护线程。
  • 守护线程中不能依靠finally块的内容来确保执行关闭或清理资源的逻辑。因为一旦所有用户线程结束运行,守护线程会随JVM一起结束工作,所以守护线程中的finally语句块可能无法被执行。
  • 因此不是所有的任务都可以分配给守护线程来执行的,比如读写操作或者计算逻辑。因为用户进程结束,自然读写操作就会被中断,而计算逻辑也得不出结果。

线程的上下文切换是什么?

多线程会共同使用一组计算机上的CPU,而线程数大于给程序分配的CPU 数量时,
为了让各个线程都有执行的机会,就需要轮转使用CPU。不同的线程切换使用CPU
发生的切换数据等就是上下文切换。