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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

多线程学习(四)

發布時間:2024/4/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 多线程学习(四) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

讓步

yield() 給線程調度機制一個暗示:你的工作已經做得差不多了,可以讓別的線程使用cpu了.這只是一個暗示,沒有任何機制保證它會被采納。

后臺線程

后臺線程是指程序執行時候,在后臺提供一種通用服務的線程。并且這種線程并不屬于程序的不可缺少的一部分。因此當所有的非后臺線程結束時,程序也就截止了,同時也會殺死進程中所有后臺線程。例如 main()就是一個非后臺線程

package thread.test1;import java.util.concurrent.TimeUnit;public class SimpleDaemons implements Runnable {@Overridepublic String toString() {return Thread.currentThread().getName();}@Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {try {TimeUnit.MILLISECONDS.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(this);}}public static void main(String[] args) throws InterruptedException {for(int i=0;i<10;i++){Thread t=new Thread(new SimpleDaemons());t.setDaemon(true);t.start();}System.out.println("all daemons started!");TimeUnit.MILLISECONDS.sleep(1200);System.out.println("main over");} } all daemons started! Thread-6 Thread-3 Thread-8 Thread-9 Thread-0 Thread-5 Thread-4 .... Thread-6 Thread-2 main over Thread-1 Thread-5 Thread-9

這里是顯示的設置線程為后臺線程,當然也可以通過定制ThreadFactory定制由Executor創建的線程的屬性(這句話拗口)代碼如下:
定制的ThreadFactory:

public class DaemonThreadFactory implements ThreadFactory {@Overridepublic Thread newThread(Runnable r) {// TODO Auto-generated method stubThread t=new Thread(r);t.setDaemon(true);return t;}} public class DaemonFromFactory implements Runnable {@Overridepublic String toString() {// TODO Auto-generated method stubreturn super.toString();}@Overridepublic void run() {// TODO Auto-generated method stubwhile(true){try {TimeUnit.MILLISECONDS.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(this);}}public static void main(String[] args) throws Exception {ExecutorService exec=Executors.newCachedThreadPool(new DaemonThreadFactory()); //通過ThreadFactory 定制ExecutorServicefor(int i=0;i<5;i++){exec.execute(new DaemonFromFactory());}System.out.println("all daemon run!");TimeUnit.MILLISECONDS.sleep(1200);}}

也可通過繼承ThreadPoolExecutor加定制ThreadFactory 來定制exector來設置線程的屬性:

public class DaemonThreadPoolExecutor extends ThreadPoolExecutor {public DaemonThreadPoolExecutor() {super(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>(), new DaemonThreadFactory());//其實這里參數除了ThreadFactory 都是CachedThreadPool的參數配置/*** 構造方法中各個參數的意義: * corePoolSize: 線程池維護線程的最少數量* * maximumPoolSize:線程池維護線程的最大數量* * keepAliveTime: 線程池維護線程所允許的空閑時間* * unit: 線程池維護線程所允許的空閑時間的單位* * workQueue: 線程池所使用的緩沖隊列* * handler: 線程池對拒絕任務的處理策略*/}public static void main(String[] args) throws Exception {ExecutorService exec = new DaemonThreadPoolExecutor();for (int i = 0; i < 5; i++) {exec.execute(new DaemonFromFactory());}System.out.println("all daemon run");TimeUnit.MILLISECONDS.sleep(1200);} }

ThreadPoolExecutor 介紹:http://blog.csdn.net/wangwenhui11/article/details/6760474
SynchronousQueue 介紹:http://ifeve.com/java-synchronousqueue/

可以通過isDaemon() 來判斷一個線程是否是后臺線程,一個后臺線程創建的線程也是后臺線程。
后臺線程可以在不執行finally的情況下就終止其線程

public class ADaemon implements Runnable {@Overridepublic void run() {// TODO Auto-generated method stubtry {System.out.println("a daemon is runing");TimeUnit.MILLISECONDS.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}finally {System.out.println("finally block exec?");}}public static void main(String[] args) throws Exception {Thread t=new Thread(new ADaemon());t.setDaemon(true);t.start();} } //output //a daemon is runing 有可能在后臺線程還沒有運行起來主線程就結束了,所以可能什么都不輸出,多運行幾次能看到這個輸出結果

因此不能優雅的關閉后臺線程,后臺線程結束也沒有任何確認形式

轉載于:https://www.cnblogs.com/joeCqupt/p/6814665.html

總結

以上是生活随笔為你收集整理的多线程学习(四)的全部內容,希望文章能夠幫你解決所遇到的問題。

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