守护线程的创建和运行

  Java中有一种特殊的线程叫做守护(Daemon)线程。这种线程的优先级很低,通常来说,当同一个应用程序里没有其他的线程运作的时候,守护线程才运行。当守护线程是程序中唯一的线程时,守护线程执行结束后,JVM也就结束了这个程序。一个典型的守护线程是Java的垃圾回收器(Garbage Collector)。

示例程序如下:

1.创建Event类

import java.util.Date;

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;
    }

}

2. 创建WriterTask类

import java.util.Date;
import java.util.Deque;
import java.util.concurrent.TimeUnit;

public class WriterTask implements Runnable {
    private Deque<Event> deque;
    public WriterTask(Deque<Event> deque){
        this.deque = deque;
    }
    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            Event event = new Event();
            event.setDate(new Date());
            event.setEvent(String.format(
                    "The thread %s has been generated an event", Thread
                            .currentThread().getId()));
            deque.addFirst(event);
            // System.out.println("event: "+event.getDate());
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

}

3. 创建CleanerTask类

import java.util.Date;
import java.util.Deque;
import java.util.concurrent.TimeUnit;

public class CleanerTask extends Thread {
    private Deque<Event> deque;
    public CleanerTask(Deque<Event> deque){
        this.deque = deque;
        this.setDaemon(true);
    }
    @Override
    public void run() {
        while(true){
            Date date = new Date();
            clean(date);
        }
    }

    private void clean(Date date){
        long diff;
        boolean delete;
        if(deque.isEmpty())
            return;
        delete = false;
        do{
            Event e = deque.getLast();
            diff = date.getTime()-e.getDate().getTime();
            if(diff>10000){
                System.out.printf("Cleaner: %s\n", e.getEvent());
                deque.removeLast();
                delete = true;
            }
        }while(diff>10000&&!deque.isEmpty());
        if(delete){
            System.out.printf("Cleaner: Size of the queue: %d\n", deque.size());
        }
    }
}

4. 实现主类Main

import java.util.ArrayDeque;
import java.util.Deque;

public class Main {

    public static void main(String[] args) {
        Deque<Event> deque = new ArrayDeque<Event>();
        WriterTask wt = new WriterTask(deque);
        //创建三个客户端进程
        for(int i=0;i<3;i++){
            Thread t = new Thread(wt);
            t.start();
        }
        //创建一个守护进程
        CleanerTask ct = new CleanerTask(deque);
        ct.start();
    }
}

注:setDaemon()方法只能在start()方法被调用之前设置。一旦程序开始运行,将不能在修改守护状态。

时间: 2024-12-24 21:09:50

守护线程的创建和运行的相关文章

JAVA 并发编程之守护线程的创建与运行

java里有一种特殊的线程叫做守护线程(Daemon)线程.这种线程的优先级很低,通常来说,当同一个应用程序里没有其他的线程运行的时候,守护线程才运行.当程序中唯一运行的的线程是守护线程时,并且守护线程执行结束后 ,JVM也就结束了这个程序. 因为这种特性,守护线程通常被用来作为同一程序中普通线程(用户线程)的服务提供者.它们通常是无线循环的,以等待服务请求或者执行线程的任务.它们不能做重要工作,因为我们不可能知道守护线程什么时候获取CPU时钟,并且,在没有其他线程运行时,守护线程随时可以结束.

Java7并发编程实战(一) 守护线程的创建和运行

Java里有一种特殊的线程叫做守护(Daemon)线程,这种线程的优先级很低,通常来说,当一个应用程序里面没有其他线程运行的时候,守护线程才运行,当线程是程序中唯一运行的线程时,守护线程执行结束后,JVM也就结束了这个程序.因此,守护线程通常被用来作为同一程序中普通线程的服务提供者,通常是无线循环的,以等待服务请求或者线程任务. 代码实现 1:创建Event类,声明两个私有属性 package com.packtpub.java7.concurrency.chapter1.recipe7.eve

基础学习day11--多线程一线程的创建,运行,同步和锁

1.1.进程和线程 进程:一个应用程序一般都是一个进程,正在进行的程序 每一个进程最少都有一个线程,都有一个执行顺序,该顺序是一个执行路径或者一个控制单元 线程:进程中一个独立的控制单元,线程控制着进程的执行. windows中的任务管理器,可以查看进程,linux下通过ps命令 线程是进程的最小单位 线程依赖于进程 线程随着进程的创建和创建,随着进程的结束而消亡 如迅雷:可以同时开启多个下载,就是多线程 多个程序同时执行,时CPU在很快的切换,看上去是同时执行,实际上是在CPU在切换执行. 多

线程的创建和运行

Java提供了两种方式来创建线程: 继承Thread类,并且覆盖run()方法. 创建一个实现Runnable接口的类.使用带参数的Thread构造器来创建Thread对象. 这里我们只以Runnable接口为例: package concurrency; public class Test1 {     public static void main(String[] args) {         for(int i = 1; i <= 10; i++) {             Calc

深入分析JVM中线程的创建和运行原理 (yet)

在JVM中除了应用线程,还有其他的一些线程用于支持JVM的运行,这些线程可以被划分为以下几类: VM Thread:负责JVM在安全点内的各种操作,这些操作(诸如自动内存管理.取消偏向锁.线程dump.线程挂起等等)在执行过程中需要JVM处于这样一个状态--堆的内容不会被改变,这种状态在JVM里叫做安全点(safe-point). Periodic task thread:这个线程负责响应定时触发的事件(例如:中断),用来执行一些定时操作. GC thread:这些线程负责JVM里的垃圾收集活动

python全栈开发基础【第二十四篇】(利用threading模块开线程、join与守护线程、GIL与Lock)

一多线程的概念介绍 threading模块介绍 threading模块和multiprocessing模块在使用层面,有很大的相似性. 二.开启多线程的两种方式 创建线程的开销比创建进程的开销小,因而创建线程的速度快. #开启进程的第一种方式 from multiprocessing import Process from threading import Thread import os import time def work(): print('<%s> is running'%os.g

面试官: 谈谈什么是守护线程以及作用 ?

文章首发自微信公众号: 小哈学Java 个人网站: https://www.exception.site/java-concurrency/java-concurrency-daemon-thread 目录 一.什么是守护线程 二.守护线程的作用及应用场景 三.总结 一.什么是守护线程 守护线程相对于正常线程来说,是比较特殊的一类线程,那么它特殊在哪里呢?别急,在了解它之前,我们需要知道一个问题,那就是: JVM 程序在什么情况下能够正常退出? The Java Virtual Machine

Dalvik虚拟机进程和线程的创建过程分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/8923484 我们知道,在Android系统中,Dalvik虚拟机是运行Linux内核之上的.如果我们把Dalvik虚拟机看作是一台机器,那么它也有进程 和线程的概念.事实上,我们的确是可以在Java代码中创建进程和线程,也就是Dalvik虚拟机进程和线程.那么,这些Dalvik虚拟机所创建的进程 和线程与其宿主Linux内核的进程和线程有什么关

linux内核线程的创建与销毁

linux将创建内核线程的工作交给了一个专门的内核线程kthreadd来完成,该线程会检查全局链表kthread_create_list,如果为NULL,就会调schedule()放弃cpu进入睡眠状态,否则就取下该链表中的一项创建对应的线程.本文就从khtreadd内核线程的创建开始来展示一下内核线程的创建过程.1 kthreaddlinux2.6.30,创建内核线程是通过kethradd内核守护线程来完成的,虽然机制上有所变化,但是最终还是调用do_fork来完成线程的创建.Kthreadd