黑马程序员技术交流社区
标题:
线程保护问题
[打印本页]
作者:
黄湘怡
时间:
2011-12-25 19:04
标题:
线程保护问题
本帖最后由 黄湘怡 于 2011-12-26 20:15 编辑
线程中的setDaemon到底有什么用呢?
package cn.thread;
public class Demo8 {
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
ThTest th = new ThTest();
Thread t = new Thread(new Runnable(){
public void run(){
for(int x = 0;x<10;x++){
System.out.println("x = "+x);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});
for(int m = 0;m<5;m++){
System.out.println("m = "+m);
Thread.sleep(1000);
}
t.setDaemon(true);
th.setDaemon(true);
t.start();
th.start();
}
}
class ThTest extends Thread{
public void run(){
for(int i = 0;i<10;i++){
System.out.println("i = "+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
复制代码
运行的结果是:
m = 0
m = 1
m = 2
m = 3
m = 4
x = 0
i = 0
当for循环结束时,两个线程都都结束了,那写上有什么用呢?
作者:
刘海涛
时间:
2011-12-25 20:54
本帖最后由 刘海涛 于 2011-12-25 20:56 编辑
守护线程:
1. setDaemon需要在start方法调用之前使用
2. 线程划分为用户线程和后台(daemon)进程,setDaemon将线程设置为后台进程
3. 如果jvm中都是后台进程,当前jvm将exit。(随之而来的,所有的一切烟消云散,包括后台线程啦)
4. 主线程结束后,
1) 用户线程将会继续运行
2) 如果没有用户线程,都是后台进程的话,那么jvm结束
另外:
setDaemon方法把java的线程设置为守护线程,此方法的调用必须在线程启动之前执行。只有在当前jvm中所有的线程都为守护线程时,jvm才会退出。
package com.itheima.bbs;
public class Demo8 {
/**
*
* @param args
*
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
ThTest th = new ThTest();
Thread t = new Thread(new Runnable() {
public void run() {
for (int x = 0; x < 10; x++) {
System.out.println("x = " + x);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
t.setDaemon(true);
th.setDaemon(true);
t.start();
th.start();
for (int m = 0; m < 5; m++) {
System.out.println("m = " + m);
Thread.sleep(1000);
}
}
}
class ThTest extends Thread {
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println("i = " + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
复制代码
输出结果:
m = 0
i = 0
x = 0
m = 1
i = 1
x = 1
m = 2
i = 2
x = 2
i = 3
m = 3
x = 3
m = 4
i = 4
x = 4
i = 5
x = 5
作用是可以让一个用户线程去控制jvm的退出,守护线程只能执行jvm退出之前的操作。
作者:
黄湘怡
时间:
2011-12-26 20:11
恩,知道了,谢谢你了~!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2