守护线程
2017-12-28 22:40
99 查看
守护线程(daemon thread)只是用来为其他线程提供服务,例如垃圾处理线程,当所有其他线程都终止只剩下守护线程时,虚拟机就退出了。不要让守护线程去访问固有资源,如文件、数据库,因为它可能在任何时候中断,不安全。可以用
两个线程,一个为写日志线程,一个为清理日志线程,我们把后者设置为守护线程,这样当前者终止时,后者就会自动终止,虚拟机会自动退出。
1.主线程
2.写日志线程
3.清理日志线程
4.运行情况
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
相关文章推荐
- JAVA笔记13__创建线程/线程休眠/等待线程终止/线程中断/守护线程
- Java线程之守护线程(Daemon)用法实例
- 多线程 线程池 守护线程
- java的守护线程
- java守护线程
- 守护线程
- 【Java多线程】之九:守护线程
- java线程--守护线程
- Java中守护线程的总结
- Java中守护线程的总结
- java守护线程与用户线程的区别
- 15.停止线程 守护线程 join() yield()
- Java中守护线程的总结
- Java的用户线程和守护线程
- 守护线程 - walkes - JavaEye技术网站
- java的守护线程与非守护线程
- 黑马程序员_day12 多线程(线程间通信,停止线程,守护线程,Join方法,优先级)
- 【转载】java的守护线程与非守护线程
- 线程的调度-守护线程
- Java DaemonThread(守护线程)