1. 程式人生 > >Java 多執行緒之-----守護程序

Java 多執行緒之-----守護程序

               

守護程序,顧名思義就是默默在後臺執行的程序,當JVM上沒有其他程序執行時執行的程序,最典型的一個列子就是

JVM自帶的垃圾清理機,他就是在其他程式不執行的時候佔用CPU來進行清理記憶體垃圾,因此他具有很強的不確定性,

因為你不知道啥時候他就會執行,也不知道啥時候他不會執行,因此適合做一個不太重要的清理工作或者伺服器上的監

聽工作。

下面我們使用JVM的daemon來寫一個小例子,實現的效果如下

In this recipe, we will learn how to create a daemon thread developing an example with two threads; one user thread that writes events on a queue and a daemon one that cleans that queue, removing the events which were generated more than 10 seconds ago。


這裡的佇列是一個雙向列表。程式碼如下


package com.bird.concursey;import java.util.Date;import java.util.Deque;import java.util.concurrent.TimeUnit;public class WriterTask implements Runnable public WriterTask(Deque<Event> deque) {  this.deque = deque; } // 這個為雙向佇列 private Deque<Event> deque; public
Deque<Event> getDeque()
{  return deque; } public void setDeque(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("The Thread " + Thread.currentThread().getId() + " has generated a event");   deque.addFirst(event);   try {    TimeUnit.SECONDS.sleep(1);   } catch (InterruptedException e) {    e.printStackTrace();   }  } }}




package com.bird.concursey;import java.util.Date;import java.util.Deque;public class CleanerTask extends Thread private Deque<Event> deque; public CleanerTask(Deque<Event> deque) {  this.deque = deque;  //設定為守護程序  setDaemon(true); }  @Override public void run() {  while(true) {   Date date = new Date();   clean(date);  } } private void clean(Date date) {  long difference = 0;  boolean delete = false;    if(deque.size() == 0) {   return;  }    do {   Event e = deque.getLast();   difference = date.getTime() - e.getDate().getTime();   if(difference > 10000) {    System.out.println("cleaner " + e.getEvent());    deque.removeLast();    delete = true;   }  }while(difference > 10000);    if(delete) {   System.out.println("cleaner : the size of the deque " + deque.size());  } } public Deque<Event> getDeque() {  return deque; } public void setDeque(Deque<Event> deque) {  this.deque = deque; }  }

package com.bird.concursey;import java.util.ArrayDeque;import java.util.Date;import java.util.Deque;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; }   public static void main(String[] args) {  Deque<Event> deque = new ArrayDeque<Event>();  WriterTask writer = new WriterTask(deque);  for(int i = 0; i < 3; i++) {   Thread thread = new Thread(writer);   thread.start();  }  CleanerTask cleaner = new CleanerTask(deque);  cleaner.start(); }}

執行結果就是

cleaner The Thread 12 has generated a eventcleaner The Thread 11 has generated a eventcleaner : the size of the deque 27cleaner The Thread 13 has generated a eventcleaner : the size of the deque 26cleaner The Thread 13 has generated a eventcleaner The Thread 12 has generated a eventcleaner The Thread 11 has generated a eventcleaner : the size of the deque 26cleaner The Thread 12 has generated a e

這個佇列總是維護在25-30左右,因為上來三個執行緒建立了30個事件,然後等建立事件的執行緒休息的時候,daemon線

程就會佔用CPU time 來執行清理建立好的事件,這樣就會讓佇列一直維護在25-30左右,最關鍵的一句

//設定為守護程序 setDaemon(true);必須在start之前設定,因為執行緒一旦執行起來了就不能更改他的狀態,這樣就開

始了監控的狀態,守護程序就OK了

           

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!https://blog.csdn.net/jiangjunshow