守护线程

守护线程(daemon thread)只是用来为其他线程提供服务,例如垃圾处理线程,当所有其他线程都终止只剩下守护线程时,虚拟机就退出了。不要让守护线程去访问固有资源,如文件、数据库,因为它可能在任何时候中断,不安全。可以用setDaemon(true)方法把一个线程设置为守护线程。下面是使用守护者线程的一个例子:
两个线程,一个为写日志线程,一个为清理日志线程,我们把后者设置为守护线程,这样当前者终止时,后者就会自动终止,虚拟机会自动退出。

1.主线程

package DaemonThread;

import java.util.ArrayList;
import java.util.List;

    public class MainClass {

        public static List<Integer> logs = new ArrayList<Integer>();
        public static int index = 0;

        public static void main(String[] args) {
            LogWriter writer = new LogWriter();
            LogCleaner cleaner = new LogCleaner();

            cleaner.setDaemon(true);

            writer.start();
            cleaner.start();
        }
    }

2.写日志线程

package DaemonThread;

public class LogWriter extends Thread {
    @Override
    public void run() {

        while (true) {
            synchronized (MainClass.logs) {
                if (MainClass.index > 10) break;
                int index = MainClass.index++;
                MainClass.logs.add(index);
                System.out.println("写入了日志" + index);
                System.out.println("现在的日志为:" + MainClass.logs);
            }
            try {
                sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

3.清理日志线程

package DaemonThread;

public class LogCleaner extends Thread {
    @Override
    public void run() {
        while (true) {
            synchronized (MainClass.logs) {
                if (MainClass.logs.size() > 5) {
                    System.out.println("清理了日志" + MainClass.logs.get(0));
                    MainClass.logs.remove(0);
                    System.out.println("现在的日志为:" + MainClass.logs);
                }
            }
            try {
                sleep(500);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

4.运行情况

写入了日志0
现在的日志为:[0]
写入了日志1
现在的日志为:[0, 1]
写入了日志2
现在的日志为:[0, 1, 2]
写入了日志3
现在的日志为:[0, 1, 2, 3]
写入了日志4
现在的日志为:[0, 1, 2, 3, 4]
写入了日志5
现在的日志为:[0, 1, 2, 3, 4, 5]
清理了日志0
现在的日志为:[1, 2, 3, 4, 5]
写入了日志6
现在的日志为:[1, 2, 3, 4, 5, 6]
清理了日志1
现在的日志为:[2, 3, 4, 5, 6]
写入了日志7
现在的日志为:[2, 3, 4, 5, 6, 7]
清理了日志2
现在的日志为:[3, 4, 5, 6, 7]
写入了日志8
现在的日志为:[3, 4, 5, 6, 7, 8]
清理了日志3
现在的日志为:[4, 5, 6, 7, 8]
写入了日志9
现在的日志为:[4, 5, 6, 7, 8, 9]
清理了日志4
现在的日志为:[5, 6, 7, 8, 9]
写入了日志10
现在的日志为:[5, 6, 7, 8, 9, 10]
清理了日志5
现在的日志为:[6, 7, 8, 9, 10]

Process finished with exit code 0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值