volatile是一個弱同步機制關鍵字,只能實現同步機制中的可見功能,不能實現互斥訪問。用在變量的聲明上時,表示多個線程獲取此變量時,都是最新的數據(變量會自動更新最新數據)。
synchronized 是一個內置鎖,也就是java內部加鎖機制。用在方法上時,每一個線程進入的時候,它會得到方法所在的對象的鎖,離開方法後釋放對象鎖。
自定義定時任務
任務管理類
package com.effectJava.Chapter3; import java.util.concurrent.TimeUnit; public class ManagerTask { private static boolean isManagerTaskEnd; public synchronized static void setIsManagerTaskEnd(boolean flage) { isManagerTaskEnd = flage; } public synchronized static boolean isIsManagerTaskEnd() { return isManagerTaskEnd; } // private static mytimeTask timetask = new mytimeTask(); public static void main(String... args) throws Exception { // 開啓任務線程 new Thread(){ @Override public void run() { while (true){ if(isIsManagerTaskEnd()){//沒開啓任務線程 setIsManagerTaskEnd(false); new mytimeTask().start(); } } } }.start(); //開啓timetask任務 setIsManagerTaskEnd(true); TimeUnit.SECONDS.sleep(1); //關閉 // setIsManagerTaskEnd(false); //關閉timetask mytimeTask.setFlagesTrue(true); TimeUnit.SECONDS.sleep(2); mytimeTask.setFlagesTrue(false); setIsManagerTaskEnd(true); } }
任務處理類java
package com.effectJava.Chapter3; public class mytimeTask extends Thread{ private volatile static boolean flages ; private static int count; //設置可見性 public static boolean isFlages() { return flages; } public static void setFlagesTrue(boolean flage) { flages = flage; } @Override public void run() { while (!isFlages()) { System.out.println("執行任務"); //執行任務代碼 } } public synchronized static int reCount() { return count++; } public synchronized static int getCount() { return count; } }