Java多線程基礎概念
進程跟線程的區別
- 進程process是操做系統中運行的一個任務,佔有必定的內存資源;線程thread是進程中包含的一個或多個執行單元,歸屬於進程
多線程的應用場景
- 一個程序須要同時完成多個任務時
- 多個線程效率更高的狀況下,好比下載
併發原理
- 對於單核cpu來講,多線程並非同時進行的,操做系統將時間分紅了多個時間片,大概均勻的分配給線程,到達某個線程的時間段,該線程運行,其他時間待命,這樣從微觀上看,一個線程是走走停停的,宏觀感官上,在某一時刻彷佛全部線程都在運行。併發是針對時間片斷來講的,在某個時間段內多個線程處於runnable到running之間,但每一個時刻只有一個線程在running,這叫作併發。
建立線程
- 繼承Thread類,重寫run方法
- 定義線程體Runnable run1,實現Runnable接口,Thread t = new Thread(run1);
- 繼承Thread建立線程相對於實現Runnable接口來建立,有兩點壞處,一是將線程與任務造成了強耦合關係,破壞了線程的複用性,二是java中的類只能繼承一個父類,繼承Thread阻斷了其它的繼承關係,而一個類能夠實現多個接口,很靈活
- thread的start方法,用於將線程歸入到線程調度 ,線程進入runnable狀態
- 可使用匿名內部類的方式建立線程
java中線程的幾個經常使用api
- Thread.currentThread(); //獲取當前線程,返回Thread
- Thread.getId(); //獲取線程id,返回long
- Thread.getName(); //獲取線程名字,返回String
- Thread.getPriority(); //獲取線程優先級,返回int,提供了三個常量(MIN_PRIORITY、MAX_PRIORITY、NORM_PRIORITY)
- Thread.getState(); //獲取線程狀態
- Thread.isAlive(); //獲取線程是否活動
- Thread.isDaemon(); //返回是不是守護線程
- Thread.isInterrupted(); //返回是否中斷
- static Thread.interrupted();//返回是否中斷,並重置中斷狀態爲false
- Thread.sleep(ms); //使線程進入休眠,sleepblock,休眠結束回到Runnable
- static Thread.yield(); //static方法,讓出時間片並回到Runnable
- Thread.join(); //好比在線程b的方法中加入a.join,表明等待線程a執行完畢,再執行b
守護線程
- setDaemon(boolean b); //須要在start方法調用前進行設置
- 當線程只剩下守護線程時,全部守護線程終止
- 好比GC
synchronized
- 多個線程併發讀寫同一個臨界資源,會引起線程併發安全問題
** 臨界資源:多線程共享實例變量;多線程共享靜態資源變量
** 解決辦法:異步變同步
- 同步與異步
** 有前後順序的運行方式是同步
** 沒有前後順序,由線程調度隨機分配時間片斷運行,是異步
- synchronized是java中的同步鎖
- synchronized能夠修飾某個方法,使訪問這個方法的線程同步
- synchronized(object){代碼塊}; //object必須是同一對象,鎖纔有效用
** 若是synchronized在一個非靜態方法中,一般鎖對象是this
** synchronized也能夠直接修飾代碼塊
wait¬ify
- 多線程之間協調工做
- 條件不知足,等待wait,條件知足notify,等待喚醒
- 若是想在一個線程上等待,在另外一個線程上notify,那麼須要給這兩個方法加鎖
** synchronized(obj){obj.wait();}
** synchronized(obj){obj.notify();}
- 若是多個線程在一個線程上等待,notify()只能喚醒一個,notifyAll()能夠喚醒全部
線程安全API與非線程安全API
- StringBuffer 同步的,線程安全,synchronized append()]
- StringBuilder 不一樣步的,線程不安全的,append()
- Vector Hashtable ConcurrentHashMap同步,線程安全
- ArrayList HashMap 不一樣步,線程不安全
- Collections.synchronizedList(list) 獲取線程安全的list集合
- Collections.synchronizedSet(set) 獲取線程安全的set集合
- Collections.synchronizedMap(map) 獲取線程安全的map
線程池
- 重用與限制數量
- 線程池的使用與ExecutorService實現:另開一章
歡迎關注本站公眾號,獲取更多信息