線程管理(七)守護線程的創建和運行

聲明:本文是《?Java 7 Concurrency Cookbook?》的第一章, 作者: Javier Fernández González 譯者:鄭玉婷 校對:方騰飛

守護線程的創建和運行

Java有一種特別的線程叫做守護線程。這種線程的優先級非常低,通常在程序里沒有其他線程運行時才會執行它。當守護線程是程序里唯一在運行的線程時,JVM會結束守護線程并終止程序。

根據這些特點,守護線程通常用于在同一程序里給普通線程(也叫使用者線程)提供服務。它們通常無限循環的等待服務請求或執行線程任務。它們不能做重要的任務,因為我們不知道什么時候會被分配到CPU時間片,并且只要沒有其他線程在運行,它們可能隨時被終止。JAVA中最典型的這種類型代表就是垃圾回收器。

在這個指南中, 我們將學習如何創建一個守護線程,開發一個用2個線程的例子;我們的使用線程會寫事件到queue, 守護線程會清除queue里10秒前創建的事件。

準備

指南中的例子是使用Eclipse IDE 來實現的。如果你使用Eclipse 或者其他的IDE,例如NetBeans, 打開并創建一個新的java項目。

怎么做呢

按照這些步驟來實現下面的例子:

1.? ?創建 Event 類. 這個類只是用來儲存我們程序里的工作的事件信息。聲明2個屬性,一個是java. util.Date 類型的 date 和另一個是String 類型的event 。并生成它們的讀值和寫值方法。

2.? ?創建 WriterTask 類并實現Runnable接口。

1 public?class?WriterTask?implements?Runnable {

3.? ?聲明queue,儲存事件并實現類的構造函數,初始化queue。

1 private?Deque<Event> deque;
2 public?WriterTask (Deque<Event> deque){
3 this.deque=deque;
4}

4.? ?實現這個任務的 run() 方法 。 此方法有100個循環。在每個循環中我們會創建 一個Event對象,并保存到 queue里, 然后休眠1秒。

01@Override
02 public?void?run() {
03 for?(int?i=1; i<100; i++) {
04 ???Event event=new?Event();
05 ???event.setDate(new?Date());
06 ???event.setEvent(String.format("The thread %s has generated an?? event",Thread.currentThread().getId()));
07 ???deque.addFirst(event);
08 ???try?{
09 ??????TimeUnit.SECONDS.sleep(1);
10 ???}?catch?(InterruptedException e) {
11 ??????e.printStackTrace();
12 ???}
13 ?}
14}

5.? ?創建 CleanerTask 類并一定擴展Thread類。

1 public?class?CleanerTask?extends?Thread {

6.? ?聲明 queue,儲存事件并實現類的構造函數,初始化queue,在這個構造函數,用setDaemon() 方法讓此線程成為守護線程。

1 private?Deque<Event> deque;
2 public?CleanerTask(Deque<Event> deque) {
3 this.deque = deque;
4 setDaemon(true);
5}

7.?? 實現run()方法。它是無限循環來獲取當前日期并調用 clean() 方法.

1@Override
2 public?void?run() {
3 ?while?(true) {
4 ???Date date =?new?Date();
5 ???clean(date);
6 ?}
7}

8.? ?實現 clean() 方法. 它獲取最后的事件,如果它在10秒前被創建,就刪除它并查看下一個事件。如果一個事件被刪除,它會寫一個事件信息和queue的新的大小,為了讓你看到變化過程。

01 private?void?clean(Date date) {
02 ??long?difference;
03 ??boolean?delete;
04 ??if?(deque.size()==0) {
05 ????return;
06 ??}
07 ??delete=false;
08 ??do?{
09 ????Event e = deque.getLast();
10 ????difference = date.getTime() - e.getDate().getTime();
11 ????if?(difference >?10000) {
12 ?????System.out.printf("Cleaner: %s\n",e.getEvent()); deque.removeLast();
13 ?????delete=true;
14 ????}
15 ??}?while?(difference >?10000);
16 ??if?(delete){
17 ???System.out.printf("Cleaner: Size of the queue: %d\n",deque. size());
18 ??}
19}

9.? ?現在實現主類。 創建一個類名為 Main 和 main() 方法。

1 public?class?Main {
2 public?static?void?main(String[] args) {

10. 創建使用 Deque 類的queue 來保存事件。

1 Deque<Event> deque=new?ArrayDeque<Event>();

11. 創建 和開始3個 WriterTask 線程和一個 CleanerTask.

1 WriterTask writer=new?WriterTask(deque);
2 for?(int?i=0; i<3; i++){
3 Thread thread=new?Thread(writer);
4thread.start();
5}
6 CleanerTask cleaner=new?CleanerTask(deque);
7cleaner.start();

12. 運行程序查看結果。

它是怎么工作的

如果分析這個程序的輸出,你可以發現queue可以一直增加直到它有30個事件,然后它的大小會在27-30之間直到運行結束。

程序開始時有3個 WriterTask 線程。每個線程寫一個事件然后休眠1秒。10秒之后,我們有30個事件在queue里。在這10秒內,當3個 WriterTask 線程休眠時, CleanerTasks已經開始運行,但是它沒有刪除任何事件,因為所有事件都才生成不到10秒。在剩下的運行里,CleanerTask 每秒刪除3個事件, 然而3個 WriterTask 線程會另寫3個,所以queue的大小在27-30之間。

你可以修改 WriterTask 線程的休眠時間。如果你使用一個較小的值,你會發現CleanerTask 被分配到 CPU 時間片會更少,由于 CleanerTask 沒有刪除任何事件,所以queue大小會一直增加。

更多

只能在start() 方法之前可以調用 setDaemon() 方法。一旦線程運行了,就不能修改守護狀態。

可以使用 isDaemon() 方法來檢查線程是否是守護線程(方法返回 true) 或者是使用者線程 (方法返回 false)。

文章轉自?并發編程網-ifeve.com

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/395894.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/395894.shtml
英文地址,請注明出處:http://en.pswp.cn/news/395894.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue2中的keep-alive使用總結及注意事項

問題總結;最近在寫vue移動端的項目的時候,當我切換菜單,再切換換回去的時候,發現頁面出現閃動的效果,其原因是因為切換回去之后,頁面重新渲染了;為了解決這一問題:查閱資料,只需要在 入口文件 App.vue 的router-view外層包裹一個keep-active標簽,表示該組件被保存在內存中,不需…

grove 套件_如何通過使用Andy Grove的High Leverage Activities加快發展?

grove 套件by Guido Schmitz由Guido Schmitz 如何通過使用Andy Grove的High Leverage Activities加快發展&#xff1f; (How to speed up your development by using Andy Grove’s High Leverage Activities ?) Youre constantly building on new features, fixing new bugs…

ajax php 觀察者模式,JavaScript觀察者模式定義和dom事件實例詳解

觀察者模式(發布-訂閱模式)&#xff1a;其定義對象間一種一對多的依賴關系&#xff0c;當一個對象的狀態發生改變時&#xff0c;所有依賴于它的對象都將得到通知。在JavaScript中&#xff0c;一般使用事件模型來替代傳統的觀察者模式。好處&#xff1a;(1)可廣泛應用于異步編程…

python中代碼段的標志是什么車_請問這段Python代碼是什么意思?

ord(p) - ord(a)這個意思是以 a 為序號0&#xff0c;計算字符p的序號。在ASCII字符集中&#xff0c;小寫字母a-z是連續排列的&#xff0c;因此如果a是0的話&#xff0c;那么b就是1&#xff0c;c就是2……以此類推。ord(p) - ord(a) 3前面一段我們解釋過了&#xff0c;那么這一…

servlet和jsp頁面過濾器Filter的作用及配置

剛剛有個朋友問我&#xff0c;Servlet的過濾器有什么作用&#xff1f; 現在發個帖子說明一下&#xff0c; 過濾器是一個對象&#xff0c;可以傳輸請求或修改響應。它可以在請求到達Servlet/JSP之前對其進行預處理&#xff0c;而且能夠在響應離開Servlet /JSP之后對其…

tar命令速查

tar -c: 建立壓縮檔案-x&#xff1a;解壓-t&#xff1a;查看內容-r&#xff1a;向壓縮歸檔文件末尾追加文件-u&#xff1a;更新原壓縮包中的文件 這五個是獨立的命令&#xff0c;壓縮解壓都要用到其中一個&#xff0c;可以和別的命令連用但只能用其中一個。下面的參數是根據需要…

附005.Docker Compose文件詳解

一 Docker Compose文件簡介 compose文件使用yml格式&#xff0c;主要分為了四個區域&#xff1a;version&#xff1a;用于指定當前docker-compose.yml語法遵循哪個版本services&#xff1a;服務&#xff0c;在它下面可以定義應用需要的一些服務&#xff0c;每個服務都有自己的名…

如何使用TensorFlow構建簡單的圖像識別系統(第2部分)

by Wolfgang Beyer沃爾夫岡拜爾(Wolfgang Beyer) 如何使用TensorFlow構建簡單的圖像識別系統(第2部分) (How to Build a Simple Image Recognition System with TensorFlow (Part 2)) This is the second part of my introduction to building an image recognition system wi…

網站 服務器 用sqlite,sqlite服務器數據庫

sqlite服務器數據庫 內容精選換一換簡要介紹SQLite是一款輕量級的關系型數據庫&#xff0c;它的運算速度非常快&#xff0c;占用資源很少&#xff0c;不僅支持標準的SQL語法&#xff0c;還遵循了數據庫的ACID事務。編寫語言&#xff1a;C一句話概述&#xff1a;輕量級的關系型數…

type-c接口圖片_TypeC接口除了充電還能干嗎?這些功能都不知道,簡直是在浪費...

Type C手機接口相信每個使用智能手機的朋友都很熟悉&#xff0c;目前已經廣泛使用在智能手機領域&#xff0c;并且得到用戶一致好評。但是對于Type C接口真正的用處很少有人知道&#xff0c;大部分用戶只了解正反面都可充電&#xff0c;其他方面一概不知&#xff0c;對于這一點…

Zookeeper的api的簡單使用(轉載)

轉載自: http://www.cnblogs.com/sunddenly/p/4031881.html 1.API 2.API 示例 ZooKeeper中的組成員關系 理解ZooKeeper的一種方法就是將其看作一個具有高可用性的文件系統。但這個文件系統中沒有文件和目錄&#xff0c;而是統一使用“節點”(node)的概念&#xff0c;稱為znode…

必須使用301重定向的運用場景

必須使用301重定向的運用場景

1.1好素數

題目 題意&#xff1a;一個好素數的定義是&#xff0c;他是一個素數&#xff0c;然后他的左右兩邊10區間內存在素數&#xff0c;那么他就是好素數&#xff0c;現在讓你輸入一個數字&#xff0c;這個數字以內的好素數的數量。 解題方法&#xff1a;先把每一個數字是不是素數判斷…

jquery.vue.js_一個Vue.js簡介,面向只了解jQuery的人

jquery.vue.jsby Matt Rothenberg馬特羅森伯格(Matt Rothenberg) 一個Vue.js簡介&#xff0c;面向只了解jQuery的人 (A Vue.js introduction for people who know just enough jQuery to get by) I’ve had a love-hate relationship with JavaScript for years.我與JavaScrip…

python 矩陣獲取行數_4個最佳項目創意的代碼片段和示例,旨在為Python和機器學習構建出色的簡歷!...

點擊上方“小白學視覺”&#xff0c;選擇加"星標"或“置頂”重磅干貨&#xff0c;第一時間送達一篇文章帶你了解4個最佳項目創意的代碼片段和示例Python是一種特殊的編程語言&#xff0c;適用于從初學者到中級用戶。由于它的靈活性&#xff0c;它正逐漸成為一種非常流…

Android 多狀態加載布局的開發 Tips

2019獨角獸企業重金招聘Python工程師標準>>> 什么是多狀態 Layout 對于大多數 App 而言&#xff0c;項目中都有多狀態加載 View 這種需求&#xff0c;如下圖所示。 對應到開發中&#xff0c;我們通常會開發一個對應的自定義 layout 用于根據頁面不同的狀態來顯示不同…

XML解析之JAXP案例詳解

根據一個CRUD的案例&#xff0c;對JAXP解析xml技術&#xff0c;進行詳細的解釋&#xff1a; 首先&#xff0c;已知一個xml文件中的數據如下&#xff1a; <?xml version"1.0" encoding"UTF-8" standalone"no"?> <書架><書 出版社…

隨機梯度下降

1.SGD 代價函數通常可以分解成每個樣本的代價函數的總和轉載于:https://www.cnblogs.com/bigcome/p/10042800.html

iis mysql5.7_手動配置網站環境 IIS 10+PHP 7.1+MySQL 5.7

之前配置環境一直用的一鍵安裝包&#xff0c;不管是phpStudy還是lnmp&#xff0c;昨天嘗試在自己電腦配置一下iis的環境&#xff0c;也踩了一些坑&#xff0c;整理了一下。測試電腦是Windows10&#xff0c;理論上Win7和IIS7.5都支持的。安裝 IIS1&#xff1a;控制面板 > 程序…

如何使用Apache的Prediction IO Machine Learning Server構建推薦引擎

by Vaghawan Ojha通過瓦哈萬歐哈(Vaghawan Ojha) 如何使用Apache的Prediction IO Machine Learning Server構建推薦引擎 (How to build a recommendation engine using Apache’s Prediction IO Machine Learning Server) This post will guide you through installing Apache…