Java 多线程之
来源:互联网 发布:veket linux img 编辑:程序博客网 时间:2024/06/05 15:46
在java中有两类线程:用户线程和守护线程(User Thread 和 Daemon Thread)。
守护线程:
守护线程是运行在后台的一种特殊进程,它独立于控制终端,并且周期性地执行某种任务或着等待处理某些发生的事件。也就是在程序运行的时候在后台提供一种通用服务的线程,在没有用户线程客服务时会自动离开。
生命周期:守护线程并不是程序中不可缺少的部分。当所有的非守护线程即用户线程结束,程序也就终止了,同时还会kill掉进程中的所有守护线程。
守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。
例子:就像 垃圾回收线程一样,当程序中不存在任何运行的线程了,程序就不会产生垃圾,垃圾回收器也就无事可做,所以当垃圾回收器是jvm上仅存的线程时,垃圾回收线程会自动离开,它始终在低级别的状态中运行,用于实时监控和管理系统中的可回收资源。
守护线程和用户线程的主要区别
守护线程和用户线程的主要区别在于虚拟机的离开:如在用户线程全部退出运行,只剩下守护线程存在了的时候,虚拟机也就退出了。守护线程 顾名思义,需要具有守护对象,守护对象没了,守护线程也就失去了工作,所以也就没有继续运行程序的必要了。
守护线程的实现:
在Java中java.lang.Thread.isDaemon()方法用来测试线程是否为守护线程。
声明方法为:
public final boolean isDaemon()
如果结果返回True该线程就是守护线程
注意:
- Thread.Daemon(true) 必须在Thread.start()方法之前设置,否则会出现IllegalThreadStateException异常
- 不能把正在运行的常规线程设置为守护线程
- 守护线程应该永远不去访问固有资源,如:数据库、文件等。因为它会在任何时候甚至在一个操作的中间发生中断。
示例:
官方示例:
package com.test.mutlithread;public class DaemonThreadTest extends Thread { DaemonThreadTest() { setDaemon(true); } public static void main(String[] args) { Thread thread = new DaemonThreadTest(); System.out.println("thread = " + thread.currentThread());//返回对当前正在执行的线程对象的引用 // this will call run() method thread.start(); } public void run() { boolean d = isDaemon(); System.out.println("isDaemon = " + d); }}
输出:
thread = Thread[main,5,main]
isDaemon = true
常见的一个关于守护线程的例子,更容易理解:
package com.test.mutlithread;public class DaemonThreadTest_2 extends Thread { public static void main(String[] args) { DaemonThreadTest_2 test = new DaemonThreadTest_2(); // 如果不设置daemon,那么线程将输出100后才结束 test.setDaemon(true); test.start(); System.out.println("isDaemon = " + test.isDaemon()); try { System.in.read(); // 接受输入,使程序在此停顿,一旦接收到用户输入,main线程结束,守护线程自动结束 } catch (Exception e) { e.printStackTrace(); } } public void run() { for (int i = 0; i < 100; i++) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(i); } }}
会打印出0-99所有的数字,该程序接受输入,一旦接收到用户输入,main线程结束,守护线程自动结束。
注意:
如果把 System.in.read(); 注释掉,即主线程方法被注释,那么当前程序不会打印出任何数字,也就是没有执行run()方法,因为主线程直接结束,导致守护线程也结束,程序终止。
或着:
package com.test.mutlithread;import java.io.IOException;public class DaemonThreadTest_3 extends Thread { DaemonThreadTest_3() { this.setDaemon(true); this.setName("myTest-DaemonThreadTest_3-" + this.getId()); } public static void main(String[] args) { DaemonThreadTest_3 test = new DaemonThreadTest_3();// test.setDaemon(true);//调试时可以设置为false,那么这个程序是个死循环,没有退出条件。设置为true,即可主线程结束,test线程也结束。 test.start(); System.out.println("isDaemon = " + test.isDaemon()); System.out.println("Thread Name is :" + test.getName()); try { System.in.read();// 接受输入,使程序在此停顿,一旦接收到用户输入,main线程结束,守护线程自动结束 } catch (IOException ex) { ex.printStackTrace(); } } public void run() {// 永真循环线程 for (int i = 0;; i++) { try { Thread.sleep(1000); } catch (InterruptedException ex) { } System.out.println(i); } }}
- Java多线程之认识多线程
- Java多线程之ThreadLocal_1
- Android 之 Java 多线程
- Android 之 Java 多线程
- Java多线程之HelloWorld
- Java多线程之BlockingQueue
- Java多线程之CountDownLatch
- Java多线程之CyclicBarrier
- Java多线程之Exchanger
- Java多线程之Semaphore
- Java多线程之Semephore
- Java多线程之CountDownLatch
- Java多线程之synchronized
- Java多线程之ThreadLocal
- Java多线程之ThreadPool
- Java多线程之ThreadPool
- Java多线程之ThreadLocal
- Java多线程之synchronized
- 谷歌 Calendar
- Linux内核分析——操作系统的工作原理
- linux文件系统数据结构
- Webstorm的基本操作
- IC画时序波形的工具,timegen
- Java 多线程之
- BOW vs FisherVector vs VLAD
- Android开发人员不得不收集的代码
- tomcat端口被占用
- Flex布局详解
- 【深度学习与神经网络】深度学习的下一个热点——GANs将改变世界
- leetcode_middle_81_213. House Robber II
- linux笔记-selinux
- LeetCode | 412. Fizz Buzz