Java有一种特殊线程叫守护(后台)线程。

1.这类线程拥有非常低的优先级且通常只是在没有其他线程运行的情况下执行。

2.其通常作为无线循环服务去执行某项任务。

3.不能让他们去执行重要任务因为你不知道他们什么时候获得CPU时间或者何时运行结束。

4.一个很典型的案例就是Java的垃圾收集器。

本例中,我们将学习如何去差U你感觉一个守护线程。

为此,我们会开发2个线程;一个用来往队列中写入事件,另一个也就是守护线程用来清理10s之前写入的事件。


Event.java
package com.dylan.thread.ch1.c07;

import java.util.Date;

/**
* 事件类
* @author xusucheng
* @create 2018-04-14
**/
public class Event {
private Date date;
private String event; public Date getDate() {
return date;
} public void setDate(Date date) {
this.date = date;
} public String getEvent() {
return event;
} public void setEvent(String event) {
this.event = event;
}
}
WriterTask.java
package com.dylan.thread.ch1.c07;

import com.dylan.thread.ch1.c07.Event;

import java.util.Date;
import java.util.Deque;
import java.util.concurrent.TimeUnit; /**
* 写事件类
* @author xusucheng
* @create 2018-04-14
**/
public class WriterTask implements Runnable { /**
* Data structure to stores the events
*/
Deque<Event> deque; /**
* Constructor of the class
* @param deque data structure that stores the event
*/
public WriterTask (Deque<Event> deque){
this.deque=deque;
} /**
* Main class of the Runnable
*/
@Override
public void run() { // Writes 100 events
for (int i=1; i<100; i++) {
// Creates and initializes the Event objects
Event event=new Event();
event.setDate(new Date());
event.setEvent(String.format("The thread %s has generated an event",Thread.currentThread().getId()));
// Add to the data structure
deque.addFirst(event);
try {
// Sleeps during one second
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
CleanerTask.java
package com.dylan.thread.ch1.c07;

import java.util.ArrayDeque;
import java.util.Date;
import java.util.Deque; /**
* 清理事件类
*
* @author xusucheng
* @create 2018-04-14
**/
public class CleanerTask extends Thread { /**
* Data structure that stores events
*/
private Deque<Event> deque; /**
* Constructor of the class
* @param deque data structure that stores events
*/
public CleanerTask(Deque<Event> deque) {
this.deque = deque;
// Establish that this is a Daemon Thread
setDaemon(true);
} /**
* Main method of the class
*/
@Override
public void run() {
while (true) {
Date date = new Date();
clean(date);
}
} /**
* Method that review the Events data structure and delete
* the events older than ten seconds
* @param date
*/
private void clean(Date date) {
long difference;
boolean delete; if (deque.size()==0) {
return;
} delete=false;
do {
Event e = deque.getLast();
difference = date.getTime() - e.getDate().getTime();
if (difference > 10000) {
System.out.printf("Cleaner: %s\n",e.getEvent());
deque.removeLast();
delete=true;
}
} while (difference > 10000);
if (delete){
System.out.printf("Cleaner: Size of the queue: %d\n",deque.size());
}
}
}


Main.java
package com.dylan.thread.ch1.c07;

import java.util.ArrayDeque;
import java.util.Deque; /**
* @author xusucheng
* @create 2018-04-27
**/
public class Main { /**
* Main method of the example. Creates three WriterTasks and a CleanerTask
* @param args
*/
public static void main(String[] args) { // Creates the Event data structure
Deque<Event> deque=new ArrayDeque<Event>(); // Creates the three WriterTask and starts them
WriterTask writer=new WriterTask(deque);
for (int i=0; i<3; i++){
Thread thread=new Thread(writer);
thread.start();
} // Creates a cleaner task and starts them
CleanerTask cleaner=new CleanerTask(deque);
cleaner.start(); } }

调试输出:

Cleaner: The thread 14 has generated an event
Cleaner: Size of the queue: 30
Cleaner: The thread 13 has generated an event
Cleaner: The thread 15 has generated an event
Cleaner: The thread 15 has generated an event
Cleaner: The thread 14 has generated an event
Cleaner: The thread 13 has generated an event

...

Java并发编程实例--7.守护(Damon)线程的更多相关文章

  1. java并发编程笔记(七)——线程池

    java并发编程笔记(七)--线程池 new Thread弊端 每次new Thread新建对象,性能差 线程缺乏统一管理,可能无限制的新建线程,相互竞争,有可能占用过多系统资源导致死机或者OOM 缺 ...

  2. java并发编程笔记(五)——线程安全策略

    java并发编程笔记(五)--线程安全策略 不可变得对象 不可变对象需要满足的条件 对象创建以后其状态就不能修改 对象所有的域都是final类型 对象是正确创建的(在对象创建期间,this引用没有逸出 ...

  3. Java并发编程(您不知道的线程池操作)

    Java并发编程(您不知道的线程池操作) 这几篇博客,一直在谈线程,设想一下这个场景,如果并发的线程很多,然而每个线程如果执行的时间很多的话,这样的话,就会大量的降低系统的效率.这时候就可以采用线程池 ...

  4. 【Java并发编程】之二:线程中断

    [Java并发编程]之二:线程中断 使用interrupt()中断线程 ​ 当一个线程运行时,另一个线程可以调用对应的Thread对象的interrupt()方法来中断它,该方法只是在目标线程中设置一 ...

  5. java并发编程笔记(三)——线程安全性

    java并发编程笔记(三)--线程安全性 线程安全性: ​ 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现 ...

  6. Java并发编程(您不知道的线程池操作), 最受欢迎的 8 位 Java 大师,Java并发包中的同步队列SynchronousQueue实现原理

    Java_并发编程培训 java并发程序设计教程 JUC Exchanger 一.概述 Exchanger 可以在对中对元素进行配对和交换的线程的同步点.每个线程将条目上的某个方法呈现给 exchan ...

  7. 《Java并发编程实战》学习笔记 线程安全、共享对象和组合对象

    Java Concurrency in Practice,一本完美的Java并发参考手册. 查看豆瓣读书 推荐:InfoQ迷你书<Java并发编程的艺术> 第一章 介绍 线程的优势:充分利 ...

  8. Java并发编程(四):线程安全性

    一.定义 当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的. 二.线程安 ...

  9. 读书笔记-----Java并发编程实战(一)线程安全性

    线程安全类:在线程安全类中封装了必要的同步机制,客户端无须进一步采取同步措施 示例:一个无状态的Servlet @ThreadSafe public class StatelessFactorizer ...

  10. java并发编程(十五)----(线程池)java线程池简介

    好的软件设计不建议手动创建和销毁线程.线程的创建和销毁是非常耗 CPU 和内存的,因为这需要 JVM 和操作系统的参与.64位 JVM 默认线程栈是大小1 MB.这就是为什么说在请求频繁时为每个小的请 ...

随机推荐

  1. [转帖]linux系统上free命令看到的buff/cache到底是什么

    https://zhuanlan.zhihu.com/p/645904515 上周二一大早,小智准备早点去公司肝一篇技术文分享给大家的,哪成想,一到公司就被测试部的"卷王"拉去看问 ...

  2. [转帖]clickhouse存储机制以及底层数据目录分布

    https://www.cnblogs.com/MrYang-11-GetKnow/p/15818141.html#:~:text=%E6%AF%8F%E4%B8%80%E4%B8%AA%E6%95% ...

  3. [转帖]关于虚拟化中cpu的指令集SSE 4.2的不支持

    背景: 局域网中有两台服务器proxmox进行了虚拟化,跑一些测试应用.今天正好想要安装一下clickhouse跑一下.安装前准备: 测试服务器是否支持sse 4.2指令集-如下 [root@slav ...

  4. [转帖]Percolator - 分布式事务的理解与分析

    https://zhuanlan.zhihu.com/p/261115166 Percolator - 分布式事务的理解与分析 概述 一个web页面能不能被Google搜索到,取决于它是否被Googl ...

  5. [转帖]nginx 反向代理 URL替换方案

    nginx 提供反向代理服务,日常开发过程中有时候我们需要使用nginx 作为代理服务根据url的不同去访问不同的服务器或者不同端口,如下提供两种方案. 1.直接替换location  匹配部分 1. ...

  6. Windows设置一键安装Mysql数据库的方法

    Windows设置一键安装Mysql数据库的方法 前言 因为MySQL数据库的8126 65536 以及3072最大索引长度等问题 研发这边提交的补丁总是出现稀奇古怪的问题. mysql数据库又因为D ...

  7. 小白学k8s(10)-k8s中ConfigMap理解

    理解ConfigMap 什么是ConfigMap ConfigMap的创建 使用key-value 字符串创建 从env文件创建 从目录创建 通过Yaml/Json创建 ConfigMap使用 用作环 ...

  8. gRPC学习小札

    gRPC 前言 为什么使用gRPC 传输协议 传输效率 性能消耗 gRPC入门 gRPC流 证书认证 使用根证书 gRPC实现token认证 和Web服务共存 验证器 REST接口 grpcurl工具 ...

  9. js下载附件(文件时候),文件名一直不出现乱码

    if (lastUrl.name) { //我们后端很奇怪有时候是个对象属性,有时候是个string window.open(url + `?attname=${lastUrl.name}`); } ...

  10. Pytorch分布式训练,其他GPU进程占用GPU0的原因

    问题 最近跑师兄21年的论文代码,代码里使用了Pytorch分布式训练,在单机8卡的情况下,运行代码,出现如下问题. 也就是说GPU(1..7)上的进程占用了GPU0,这导致GPU0占的显存太多,以至 ...