JAVA多线程并发总结学习
简单的知识要点
java中有哪几种线程及其讲解?
Java分为两种线程?
用户线程和守护线程
什么是守护线程?
守护线程也称后台线程,服务线程,它类似于一个保姆,守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务;所谓守护线程是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因 此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止
什么是用户线程?
就是用户自定义创建的一般简单线程
用户线程与守护线程的区别?
唯一的不同之处就在于虚拟机的离开:如果用户线程已经全部退出运行了,只剩下守护线程存在了,虚拟机也就退出了。 因为没有了被守护者,守护线程也就没有工作可做了,也就没有继续运行程序的必要了。将线程转换为守护线程可以通过调用Thread对象的setDaemon(true)方法来实现
- thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程
- 在Daemon线程中产生的新线程也是Daemon的
- 守护线程应该永远不去访问固有资源,如文件、数据库,因为它会在任何时候甚至在一个操作的中间发生中断
线程的级别?
线程则是 JVM 级别的,以 Tomcat 为例,如果你在 Web 应用中启动一个线程,这个线程的生命周期并不>>会和 Web 应用程序保持同步。也就是说,即使你停止了 Web 应用,这个线程依旧是活跃的
生命周期:
守护进程(Daemon)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等>>待处理某些发生的事件。也就是说守护线程不依赖于终端,但是依赖于系统,与系统“同生共死”。当 JVM >>中所有的线程都是守护线程的时候,JVM 就可以退出了;如果还有一个或以上的非守护线程则 JVM 不会退出
Thread的interrupt,isInterrupted,interrupted的线程中断操作
- 简介
- interrupt
尝试中断线程,只是终端标识,并非直译让线程停止调,改变线程中断状态为中断,中断的是可选线程中断状态
- isInterrupted
只是获取线程中断状态,不做任何修改操作,获取的是可选线程中断状态
- interrupted
判断当前线程是否已经中断。返回中断状态并清空重置中断状态,(连续)第二次调用此方法时返回false
- interrupt
- 说明
- Thread.interrupt()方法不会中断一个正在运行的线程。
- 中断一个线程只是为了引起该线程的注意,被中断线程可以决定如何应对中断。
- 如果线程在调用 Object 类的 wait()、wait(long) 或 wait(long, int) 方法,或者该Thread类的 join()、join(long)、join(long, int)、sleep(long) 或 sleep(long, int) 方法过程中受阻,则其中断状态将被清除,它还将收到一个InterruptedException异常。这个时候,我们可以通过捕获InterruptedException异常来终止线程的执行,具体可以通过return等退出或改变共享变量的值使其退出。
Thread的wait(), notify(), notifyAll()等方法介绍
-
wait()的作用是让当前线程进入等待状态同时
wait()也会让当前线程释放它所持有的锁。“直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法”,当前线程被唤醒(进入“就绪状态”)
-
notify()和notifyAll()的唤醒对象上的等待线程
notify()和notifyAll()的作用,则是唤醒当前对象上的等待线程;notify()是唤醒单个线程,而notifyAll()是唤醒所有的线程。
-
wait使当前线程处于等待(阻塞)状态
wait(long timeout)让当前线程处于“等待(阻塞)状态”,“直到其他线程调用此对象的notify()方法或 notifyAll() 方法,或者超过指定的时间量”,当前线程被唤醒(进入“就绪状态”)。
Reference
- 线程的中断interrupt使用讲解 | 明月(Alioo) | https://blog.csdn.net/hl_java/article/details/79162097