java主线程是java设置守护线程程吗

守护线程与普通线程写法上基本没啥区别,调用线程对象的方法setDaemon(true),则可以将其设置为守护线程。 守护线程使用的情况较少,但并非无用,举例来说,JVM的垃圾回收、内存管理等线程都是守护线程。还有就是在做数据库应用时候,使用的数据库连接池,连接池本身也包含着很多后台线程,监控连接个数、超时时间、状态等等。
setDaemon方法的详细说明:public final void setDaemon(boolean on):将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java虚拟机退出。
该方法必须在启动线程前调用。
该方法首先调用该线程的checkAccess方法,且不带任何参数。这可能抛出SecurityException(在当前线程中)。
on - 如果为 true,则将该线程标记为守护线程。
IllegalThreadStateException - 如果该线程处于活动状态。
SecurityException - 如果当前线程无法修改该线程。 另请参见: isDaemon(), checkAccess()
package cn.
* 线程的调度(守护线程)
* @author 林计钦
* @version 1.0
上午09:30:42
public class ThreadDaemon {
public static void main(String[] args) {
ThreadDaemon thread=new ThreadDaemon();
Thread t1 = thread.new MyThread1();
Thread t2 = new Thread(thread.new MyRunnable());
t2.setDaemon(true); //设置为守护线程
t2.start();
t1.start();
class MyThread1 extends Thread {
public void run() {
for (int i = 0; i & 5; i++) {
System.out.println("线程1第" + i + "次执行!");
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
class MyRunnable implements Runnable {
public void run() {
for (long i = 0; i & 9999999L; i++) {
System.out.println("后台线程第" + i + "次执行!");
Thread.sleep(7);
} catch (InterruptedException e) {
e.printStackTrace();
后台线程第0次执行!
线程1第0次执行!
后台线程第1次执行!
后台线程第2次执行!
后台线程第3次执行!
后台线程第4次执行!
后台线程第5次执行!
后台线程第6次执行!
后台线程第7次执行!
后台线程第8次执行!
后台线程第9次执行!
后台线程第10次执行!
后台线程第11次执行!
后台线程第12次执行!
线程1第1次执行!
后台线程第13次执行!
后台线程第14次执行!
后台线程第15次执行!
后台线程第16次执行!
后台线程第17次执行!
后台线程第18次执行!
后台线程第19次执行!
后台线程第20次执行!
后台线程第21次执行!
后台线程第22次执行!
后台线程第23次执行!
后台线程第24次执行!
后台线程第25次执行!
线程1第2次执行!
后台线程第26次执行!
后台线程第27次执行!
后台线程第28次执行!
后台线程第29次执行!
后台线程第30次执行!
后台线程第31次执行!
后台线程第32次执行!
后台线程第33次执行!
后台线程第34次执行!
后台线程第35次执行!
后台线程第36次执行!
后台线程第37次执行!
后台线程第38次执行!
线程1第3次执行!
后台线程第39次执行!
后台线程第40次执行!
后台线程第41次执行!
后台线程第42次执行!
后台线程第43次执行!
后台线程第44次执行!
后台线程第45次执行!
后台线程第46次执行!
后台线程第47次执行!
后台线程第48次执行!
后台线程第49次执行!
后台线程第50次执行!
后台线程第51次执行!
线程1第4次执行!
后台线程第52次执行!
后台线程第53次执行!
后台线程第54次执行!
后台线程第55次执行!
后台线程第56次执行!
后台线程第57次执行!
后台线程第58次执行!
后台线程第59次执行!
后台线程第60次执行!
后台线程第61次执行!
后台线程第62次执行!
后台线程第63次执行!
后台线程第64次执行!
后台线程第65次执行!
后台线程第66次执行!
后台线程第67次执行!
后台线程第68次执行!
后台线程第69次执行!
后台线程第70次执行!
阅读(...) 评论()java的守护线程与非守护线程_悬赏任务_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
java的守护线程与非守护线程
我需要一份与标题相关的文档
收到2篇文档
相似悬赏任务他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)最近重新研究Java基础知识,发现以前太多知识知识略略带过了,比较说Java的线程机制,在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)&,(PS:以前忽略了)。
&&&&&& 估计学过Unix开发但是没有细致学习Java的同学们会疑惑了,操作系统里面是没有所谓的守护线程的概念,只有守护进程一说,但是Java语言机制是构建在JVM的基础之上的,意思是Java平台把操作系统的底层给屏蔽起来,所以它可以在它自己的虚拟的平台里面构造出对自己有利的机制,而语言或者说平台的设计者多多少少是收到Unix思想的影响,而守护线程机制又是对JVM这样的平台凑合,于是守护线程应运而生。
&&&&&& Daemon的作用是为其他线程的运行提供服务,比如说GC线程。其实User Thread线程和Daemon Thread守护线程本质上来说去没啥区别的,唯一的区别之处就在虚拟机的离开:如果User Thread全部撤离,那么Daemon Thread也就没啥线程好服务的了,所以虚拟机也就退出了。
&&&&&& 守护线程并非虚拟机内部可以提供,用户也可以自行的设定守护线程,方法:public final void setDaemon(boolean on)&;但是有几点需要注意:
1)、thread.setDaemon(true)必须在thread.start()之前设置,否则会跑出一个IllegalThreadStateException异常。你不能把正在运行的常规线程设置为守护线程。&&(备注:这点与守护进程有着明显的区别,守护进程是创建后,让进程摆脱原会话的控制+让进程摆脱原进程组的控制+让进程摆脱原控制终端的控制;所以说寄托于虚拟机的语言机制跟系统级语言有着本质上面的区别)
2)、&在Daemon线程中产生的新线程也是Daemon的。&&(这一点又是有着本质的区别了:守护进程fork()出来的子进程不再是守护进程,尽管它把父进程的进程相关信息复制过去了,但是子进程的进程的父进程不是init进程,所谓的守护进程本质上说就是&父进程挂掉,init收养,然后文件0,1,2都是/dev/null,当前目录到/&)
3)、不是所有的应用都可以分配给Daemon线程来进行服务,比如读写操作或者计算逻辑。因为在Daemon Thread还没来的及进行操作时,虚拟机可能已经退出了。
//完成文件输出的守护线程任务
import java.io.*;&&
class TestRunnable implements Runnable{&&
&&& public void run(){&&
&&&&&&&&&&&&&& try{&&
&& &&&&&&&&&&&&&&&Thread.sleep(1000);//守护线程阻塞1秒后运行&&
&&&&&&&&&&&&&&&&& File f=new File("daemon.txt");&&
&&&&&&&&&&&&&&&&& FileOutputStream os=new FileOutputStream(f,true);&&
&&&&&&&&&&&&&&&&& os.write("daemon".getBytes());&&
&&&&&&&&&& }&&
&&&&&&&&&&&&& &catch(IOException e1){&&
&&&&&&&&& e1.printStackTrace();&&
&&&&&&&&&&&&&& }&&
&&&&&&&&&&&&&& catch(InterruptedException e2){&&
&&&&&&&&&&&&&&&&& e2.printStackTrace();&&
&&&&&&&&&& }&&
public class TestDemo2{&&
&&& public static void main(String[] args) throws InterruptedException&&
&&&&&&& Runnable tr=new TestRunnable();&&
&&&&&&& Thread thread=new Thread(tr);&&
&&&&&&&&&&&&&&& thread.setDaemon(true); //设置守护线程&&
&&&&&&& thread.start(); //开始执行分进程&&
运行结果:文件daemon.txt中没有"daemon"字符串。
但是如果把thread.setDaemon(true); //设置守护线程注释掉,文件daemon.txt是可以被写入daemon字符串的
  JRE判断程序是否执行结束的标准是所有的前台执线程行完毕了,而不管后台线程的状态,因此,在使用后台线程候一定要注意这个问题。&
但是daemon Thread实际应用在那里呢?举个例子,web服务器中的Servlet,容器启动时后台初始化一个服务线程,即调度线程,负责处理http请求,然后每个请求过来调度线程从线程池中取出一个工作者线程来处理该请求,从而实现并发控制的目的。
网上摘的一个图,方便大家理解:
阅读(...) 评论()他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 java守护线程的作用 的文章

 

随机推荐