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&notify

  • 多線程之間協調工做
  • 條件不知足,等待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實現:另開一章
相關文章
相關標籤/搜索