多线程学习(四)
讓步
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:
也可通過繼承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的情況下就終止其線程
因此不能優雅的關閉后臺線程,后臺線程結束也沒有任何確認形式
轉載于:https://www.cnblogs.com/joeCqupt/p/6814665.html
總結
- 上一篇: SQL Server 2008 R2的发
- 下一篇: 鼠标跟随效果