Java高并发effective

用户线程(User Thread)和守护线程(Daemon Thread)

Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)

用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:

只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。
Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 GC (垃圾回收器),它就是一个很称职的守护者。

User和Daemon两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果 User Thread已经全部退出运行了,只剩下Daemon Thread存在了,虚拟机也就退出了。 因为没有了被守护者,Daemon也就没有工作可做了,也就没有继续运行程序的必要了。

值得一提的是,守护线程并非只有虚拟机内部提供,用户在编写程序时也可以自己设置守护线程。下面的方法就是用来设置守护线程的。 Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)
Thread daemonTread = new Thread();

// 设定 daemonThread 为 守护线程,default false(非守护线程)
daemonThread.setDaemon(true);

// 验证当前线程是否为守护线程,返回 true 则为守护线程
daemonThread.isDaemon();
jps展示当前jvm内所有的进程信息(进程号,进程名字)
jconsole +进程号 (查看进程的状态)
Java高并发effective
thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程

互斥和同步的区别

我的理解:互斥就是线程之间对一个资源的竞争,执行的结果是无序的,同步是要求程序员把这个资源进行有序化,就是按程序员的逻辑进行有序的该资源进行访问

互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。
同步其实已经实现了互斥,所以同步是一种更为复杂的互斥。
互斥是一种特殊的同步。
互斥是通过竞争对资源的独占使用,彼此之间不需要知道对方的存在,执行顺序是一个乱序。
同步是协调多个相互关联线程合作完成任务,彼此之间知道对方存在,执行顺序往往是有序的。

线程什么时候终止

当线程的run()方法结束线程也就自然死亡了,也可以调用.stop()强制让线程结束

调用start()方法时至少存在两个线程,一个是调用你自己的线程,例如:main线程,还有一个是自己创建的线程来执行run()方法