線程池和定時任務使用


線程間的等待喚醒機制

Object 類中
    void wait ()  在其他線程調用此對象的 notify () 方法或 notifyAll () 方法前,導致當前線程等待   
	void wait (long timeout) 在其他線程調用此對象的 notify () 方法或 notifyAll () 方法,或者超過指定的時間量前,導致當前線程等待。
    void notify () 喚醒在此對象監視器上等待的單個線程。    
    void notifyAll ()  喚醒在此對象監視器上等待的所有線程。    

內存可見性問題 volatile

對於可見性,Java提供了volatile關鍵字來保證可見性。
	 當一個共享變量被volatile修飾時,它會保證修改的值會立即被更新到主存,當有其他線程需要讀取時,它會去內存中讀取新值。
	 而普通的共享變量不能保證可見性,因為普通共享變量被修改之后,什么時候被寫入主存是不確定的,
	 當其他線程去讀取時,此時內存中可能還是原來的舊值,因此無法保證可見性。
	 另外,通過synchronized和Lock也能夠保證可見性,synchronized和Lock能保證同一時刻只有一個線程獲取鎖然后執行同步代碼,
	 並且在釋放鎖之前會將對變量的修改刷新到主存當中。因此可以保證可見性。
	 注意volatile不能保證有序性和原子性。

CAS 算法了解

CAS 算法
	 CAS (Compare-And-Swap) 是一種硬件對並發的支持,針對多處理器操作而設計的處理器中的一種特殊指令,用於管理對共享數據的並發訪問。CAS 是一種無鎖的非阻塞算法的實現。
CAS 包含了 3 個操作數:	
	需要讀寫的內存值 V
	進行比較的值 A
 	擬寫入的新值 B
 	當且僅當 V 的值等於 A 時, CAS 通過原子方式用新值 B 來更新 V 的值,否則不會執行任何操作。

線程的狀態轉換圖及常見執行情況

畫圖演示:  線程的狀態轉換圖及常見執行情況
   新建 , 就緒 , 運行 , 凍結 , 死亡
   新建:線程被創建出來
   就緒:具有CPU的執行資格,但是不具有CPU的執行權
   運行:具有CPU的執行資格,也具有CPU的執行權
   阻塞:不具有CPU的執行資格,也不具有CPU的執行權
   死亡:不具有CPU的執行資格,也不具有CPU的執行權

線程池的概述和使用

線程池概述
	程序啟動一個新線程成本是比較高的,因為它涉及到要與操作系統進行交互。
	而使用線程池可以很好的提高性能,尤其是當程序中要創建大量生存期很短的線程時,更應該考慮使用線程池。
	線程池里的每一個線程代碼結束后,並不會死亡,而是再次回到線程池中成為空閑狀態,等待下一個對象來使用。
	在JDK5之前,我們必須手動實現自己的線程池,從JDK5開始,Java內置支持線程池
內置線程池的使用概述
	JDK5新增了一個Executors工廠類來產生線程池,有如下幾個方法
		public static ExecutorService newCachedThreadPool():			根據任務的數量來創建線程對應的線程個數	
		public static ExecutorService newFixedThreadPool(int nThreads):	固定初始化幾個線程
		public static ExecutorService newSingleThreadExecutor():			創建一個使用單個 worker 線程的 Executor,以無界隊列方式來運行該線程。(注意,如果因為在關閉前的執行期間出現失敗而終止了此單個線程,那么如果需要,一個新線程將代替它執行后續的任務)。可保證順序地執行各個任務,並且在任意給定的時間不會有多個線程是活動的。與其他等效的 newFixedThreadPool(1) 不同,可保證無需重新配置此方法所返回的執行程序即可使用其他的線程。 
	這些方法的返回值是ExecutorService對象,該對象表示一個線程池,可以執行Runnable對象或者Callable對象代表的線程。它提供了如下方法
		Future<?> submit(Runnable task)
		<T> Future<T> submit(Callable<T> task)
	使用步驟:
		創建線程池對象
		創建Runnable實例
		提交Runnable實例
		關閉線程池
		線程池的使用例子:
			class MyTh {
   			 public static void main(String[] args) {
            	ExecutorService executorService = Executors.newCachedThreadPool();
            	Mythread mythread = new Mythread();
            	executorService.submit(mythread);
            	executorService.submit(mythread);
            	executorService.submit(mythread);
  			  }
			}
			class Mythread implements Runnable{
			    @Override
			    public void run() {
			        System.out.println("大家好我是渣渣會"+Thread.currentThread().getName());
   			  }
			}
關閉線程池操作:
	線程池的關閉關閉線程池可以調用shutdownNow和shutdown兩個方法來實現
		1.shutdownNow:對正在執行的任務全部發出interrupt(),停止執行,對還未開始執行的任務全部取消,並且返回還沒開始的任務列表。
		2.shutdown:當我們調用shutdown后,線程池將不再接受新的任務,但也不會去強制終止已經提交或者正在執行中的任務。

定時器的概述和使用

1:定時器概述
	定時器是一個應用十分廣泛的線程工具,可用於調度多個定時任務以后台線程的方式執行。
	在Java中,可以通過Timer和TimerTask類來實現定義調度的功能。
2:Timer和TimerTask
	Timer:
		public Timer()
		public void schedule(TimerTask task, long delay):	
		public void schedule(TimerTask task,long delay,long period);
		public void schedule(TimerTask task,  Date time):
		public void schedule(TimerTask task,  Date firstTime, long period):
	TimerTask:定時任務
		public abstract void run()
		public boolean cancel()
	開發中
		Quartz是一個完全由java編寫的開源調度框架。
	定時器使用:
		class Ding{
    	public static void main(String[] args) throws InterruptedException {
            Timer timer = new Timer();
            timer.schedule(new qin(),1);
            Thread.sleep(200);
            timer.cancel();
  	   }
	}
		class qin extends TimerTask {
    /**
     * The action to be performed by this timer task.
     */
   		@Override
    	public void run() {
        	Runtime rt = Runtime.getRuntime();
        try {
            Process ppp = rt.exec("calc");
        } catch (IOException e) {
            e.printStackTrace();
        	}
        	cancel();
   	 	}
    	@Override
    	public boolean cancel() {
        	return super.cancel();
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM