Java 多執行緒之-----守護程序
阿新 • • 發佈:2019-01-13
守護程序,顧名思義就是默默在後臺執行的程序,當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