日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线程管理(七)守护线程的创建和运行

發布時間:2025/3/21 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程管理(七)守护线程的创建和运行 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

聲明:本文是《?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接口。

1public?class?WriterTask?implements?Runnable {

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

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

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

01@Override
02public?void?run() {
03for?(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類。

1public?class?CleanerTask?extends?Thread {

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

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

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

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

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

01private?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() 方法。

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

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

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

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

1WriterTask writer=new?WriterTask(deque);
2for?(int?i=0; i<3; i++){
3Thread thread=new?Thread(writer);
4thread.start();
5}
6CleanerTask 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本文鏈接地址:?線程管理(七)守護線程的創建和運行

?

總結

以上是生活随笔為你收集整理的线程管理(七)守护线程的创建和运行的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。