1. 程式人生 > 實用技巧 >根據 時區 計算出 指定時間 在 該時區的 時間

根據 時區 計算出 指定時間 在 該時區的 時間

執行緒

目錄

#建立執行緒的方式

  • 方法一
extends Thread
  • 方法二
implements Runnable
  • 方法三
implements Callable<T>
  • 方法三

    執行緒池

    • Executors.newFixedThreadPool();
    • Executors.newSingleThreadExecutor();
    • Executors.newCachedThreadPool();
    • Executors.newScheduledThreadPool();

    一般需要手動建立執行緒池

    ThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize,
                                                         maximumPoolSize, 
                                                         keepAliveTime, 				                                                        unit,
                                                         workQueue,
                                                         Executors.defaultThreadFactory(), 
                                                         defaultHandler)
    

    引數說明

    • coolPoolSize 核心執行緒數

      當前執行緒池中空閒的執行緒數, 執行時該執行緒始終不會被銷燬, 要小於maximumCoreSize

    • maximumCoreSize

      執行緒池能建立的最大執行緒, 當WorkQueue的佇列儲存的任務滿了, 且當前正在執行的執行緒數

      小於maximumCorseSize時, 就會建立一個執行緒來執行不在WorkQueue中的任務, 一般設定

      為一般設定為比Runtime.getRuntime().availableProcessors()大1或2

    • keepAliveTime

      如果當前執行緒數大於corePoolSize時且有執行緒空閒時間大於keepAliveTime

      時, 銷燬執行緒數至corePoolSize

    • unit

      keepAliveTime的時間單位

    • workQueue阻塞佇列

      一般採用LinkedBlockingQueue, 預設是無邊界的, 必須要指定大小

    • threadFactory

      用於自定義執行緒的名字

    • handler

      拒絕策略, 噹噹正在執行的執行緒等於maximumPoolSize且大於workQueue佇列滿了,就會採取handler

      • new ThreadPoolExecutor.AbortPolicy()

        執行緒池預設採用該模式handler

        如果任務數超出佇列與最大執行緒數的值時丟擲異常

      • new ThreadPoolExecutor.DiscardPolicy()

        拋棄溢位的任務

      • new ThreadPoolExecutor.DiscardOldestPolicy()

        執行緒滿了且超過阻塞佇列容乃,移除佇列頭,將新任務放入佇列末尾

#執行緒的狀態

NEW , RUNNABLE , BLOCKED , WAITING, TIMED_WAITING, TERMINATED

#終止執行緒的方式

  • semaphore 訊號量,標誌位

  • stop()過時, 有可能造成死鎖

  • interrupt(), 通過isInterrupted()判斷

#volatile

  • 可見性

    保證了當資料重新寫回主存時資料,所有執行緒可見

  • 有序性 (寫在讀之前)

    對一個volatile域的寫,happens-before於後續對這個volatile域的讀

  • 原子性 !!!注意volatile不具有原子性

    保證操作不分隔

    例如:

    i++ 不具備原子性

    分為三步

    1. 從主存中讀取i

    2. i+1

    3. 將資料寫回主存

    所以操作++時要上鎖或是使用Atomic相關類, 凡是讀寫操作都不具有原子性

#ThreadLocal

每個執行緒中都有一個自己的 ThreadLocalMap 類物件,可以將執行緒自己的物件保持到其中,
各管各的,執行緒可以正確的訪問到自己的物件。