线程与进程

  • 一个运行中的软件可能包含多个进程

  • 一个运行中的进程可能包含多个线程

进程:所有线程执行完成即结束

线程:执行完逻辑就结束

  1. UI线程不会结束:

无限循环刷新界面,没有异常就不会结束

  1. 线程与进程的关系:

线程强依赖于进程,线程间不存在相互依赖的关系,一个线程结束不会对其他线程造成什么影响。

  1. 主线程与其他线程的区别:

主线程是由Java虚拟机启动时创建的。main方法执行时,主线程已经创建好并运行,因此无法设置为守护进程。除此之外,与其他线程无区别。

  1. 主线程结束,子线程未结束

两者没有关系,按照操作系统的理论,进程是资源分配的基本单位,线程是CPU调度的基本单位。对于CPU来说,两种线程都只是个普通的线程。进程的资源是线程共享的,只要进程还在,线程就可以正常执行,换句话说线程是强依赖于进程的。(Java虚拟机结束:所有存活的线程都是守护线程。只要还有非守护线程,虚拟机就不会结束。所以把子线程设置为守护线程时,主线程结束,虚拟机就会结束,最后子线程就会结束了。)

fun main() {
  thread(isDaemon = false) {
    for (i in 0..1_000_000) println(i)
  }
  println("done")
}

输出:

done
1
2
3
...
  1. Thread, Runnable, ThreadFactory, Executor

Thread:执行一个简单的线程任务

Runnable:可被多个Thread复用

ThreadFactory:主要用于标记线程名字,方便调试(阿里Java编码规范)

Executor:

常用: newCachedThreadPool()

val executors = Executors.newCachedThreadPool()
executors.execute(...)

批量处理: newFixedThreadPool()

val executors = Executors.newCachedThreadPool()
executors.execute(...)
# 不会马上结束,只是不再接受新的任务,注意与shutdownNow的区别
executors.shutdown()

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!