java守护线程,顾名思义,守护的是主进程,当主线程结束了,守护线程也就结束了
我们看代码
public class ThreadDemo {
public static void main(String[] args) {
Message message = new Message();
Runnable adder = new Adder(message);
Runnable suber = new Suber(message);
Thread thread1 = new Thread(adder, "adder");
Thread thread2 = new Thread(suber, "suber");
thread1.start();
thread2.start();
}
}
class Adder implements Runnable {
private Message msg;
public Adder(Message message){
this.msg=message;
}
@Override
public void run() {
for(int i = 0 ; i < 50;i++){
try {
Thread.sleep(150);
} catch (InterruptedException e) {
e.printStackTrace();
}
msg.add();
}
}
}
class Suber implements Runnable {
private Message msg;
public Suber(Message message){
this.msg=message;
}
@Override
public void run() {
for(int i = 0 ; i < 25 ;i++){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
msg.sub();
}
}
}
class Message{
private int num;
public Message() {
this.num =0;
}
public synchronized void add() {
num++;
System.out.println(Thread.currentThread().getName()+",num:"+num);
}
public synchronized void sub(){
num--;
System.out.println(Thread.currentThread().getName()+",num:"+num);
}
}
执行结果,adder和suber交替执行。然后因为adder操作更多一些,后面就更多执行了
我们稍作改动
添加一行
thread1.setDaemon(true);
完整代码
public class ThreadDemo {
public static void main(String[] args) {
Message message = new Message();
Runnable adder = new Adder(message);
Runnable suber = new Suber(message);
Thread thread1 = new Thread(adder, "adder");
Thread thread2 = new Thread(suber, "suber");
thread1.setDaemon(true);
thread1.start();
thread2.start();
}
}
class Adder implements Runnable {
private Message msg;
public Adder(Message message){
this.msg=message;
}
@Override
public void run() {
for(int i = 0 ; i < 50;i++){
try {
Thread.sleep(150);
} catch (InterruptedException e) {
e.printStackTrace();
}
msg.add();
}
}
}
class Suber implements Runnable {
private Message msg;
public Suber(Message message){
this.msg=message;
}
@Override
public void run() {
for(int i = 0 ; i < 25 ;i++){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
msg.sub();
}
}
}
class Message{
private int num;
public Message() {
this.num =0;
}
public synchronized void add() {
num++;
System.out.println(Thread.currentThread().getName()+",num:"+num);
}
public synchronized void sub(){
num--;
System.out.println(Thread.currentThread().getName()+",num:"+num);
}
}
由执行结果可以看出,把adder设置成为守护线程,suber结束后,adder就也结束了。
此外,java中最大的守护线程是GC,当所有线程结束了,GC也就结束了。