在Java
面向對象中的多線程中,要理解多線程的知識點,首先要掌握什麼是進程,什麼是線程?爲何有多線程呢?多線程存在的意義有什麼什麼呢?線程的建立方式又有哪些?以及要理解多線程的特色等。java
多線程?線程,多個線程,如何理解什麼是進程呢?編程
如圖:多線程
任務管理器中有個進程,下面列表的則是正在進行中的任務程序,都屬於進程(正在執行中的程序),那麼具體的進程是什麼?進程實質是:應用程序在內存中運行的所佔空間。併發
能夠理解爲一個空間,當一個應用程序啓動時,就爲一個進程,如qq
的啓動,能夠爲一個進程,(簡單理解正在進行的應用程序),那麼咱們在玩qq
的時候,進行聊天,那麼這個聊天爲進程中的線程,即爲一個執行單元,那麼這個應用程序不只只有一個線程,一個進程能夠有多個線程,那麼這個應用程序就被稱爲多線程程序。jvm
多線程,你在玩qq
的時候,是否是同時和其餘人聊天呢?即爲多線程嘛,能夠這麼理解。多線程同時處理問題,和執行任務。函數
一個進程中至少有一個線程性能
一個應用程序啓動了多線程,能夠實現多個任務同時執行,這也就是Java中的併發概念。測試
多線程是如何使用的呢?多線程的使用能夠合理的安排cpu
的調用,多線程會致使程序的性能下降,多線程是靠cpu
內部處理快速切換完成的。this
主方法的運行,主線程運行負責,start
方法開啓一個線程spa
class Demo{ private String name; Demo(String name){ this.name = name; } public void show(){ for(int i = 0; i < 10; i++){ System.out.println("name"+name+"運行到第"+i); } } } // 測試 class ThreadDemo{ public static void main(String[] args){ Demo demo1 = new Demo("dashu"); Demo demo2 = new Demo("dashu2"); demo1.show(); demo2.show(); } } // 主線程,先運行demo1.show()完成後再次運行demo2.show()
多線程中的一些概念,程序指用靜態的計算機語言編寫的代碼程序,多進程指在操做系統中有多個程序同時執行,那麼多線程是指在程序中有多個線程同時執行咯~
再次強調:一個進程中至少要有一個線程,一個進程能夠有多個線程
java.lang.Object->java.lang.Thread public class Thread extends Object implements Runnablef
線程對象調用run
方法是不開啓線程的,由對象調用方法,是main
主線程負責的,調用start
開啓線程,並讓jvm
調用run
方法在開啓的線程中執行,即開啓線程,多一條路能夠走。注意有主線程負責的爲一條線程路,run
方法啓動的。
// 爲一條主線程,先執行d1,而後爲d2 d1.run(); d2.run(); // 爲兩條線程,d2和d1不併發,run()走完,纔開啓start() d1.run(); d2.start(); // 爲三條線程 d1.start(); d2.start(); // 爲兩條線程,d2和d1併發 d2.start(); d1.run();
Thread
類的子類,覆蓋run()
方法,建立子類對象,就是建立線程對象,而後調用start
方法(開啓線程讓線程去執行,而後讓jvm
調用run
方法)。Runnable
接口的類,實現run()
方法。// 聲明一個 Thread 類的子類,覆蓋run()方法 class Mythread extends Thread { // 覆蓋run方法 public void run( ){ ... } }
繼承Thread
類,是由於Thread
類中有描述線程的事務,具有線程該有的功能,建立線程是爲了創建獨立的執行路徑,實現代碼同時執行,線程的建立就是爲了給線程執行任務。
Runnable
接口,public interface Runnable
Demo d = new Demo("dashucoding"); Thread t1 = new Thread(d); t1.start();
定義類實現Runnable
接口,覆蓋run
方法,線程任務代碼在run
中定義,建立Runnable
接口的子類對象,建立線程對象,並將Runnable
接口的子類對象做爲參數傳遞給Thread
的構造函數,start
調用開啓線程便可。
// 聲明一個實現 Runnable 接口的類,實現run()方法 class Mythread implements Runnable { // 實現run方法 public void run( ){ ... } }
主線程是運行在main
函數中的,自定義的線程是要將須要執行的任務定義在run
方法中,在Thread
類中的run
方法不是咱們須要執行的,因此咱們須要本身重寫這個方法,將要執行的任務diam
定義在run
方法中便可。
建立新的執行線程在
Java
中有兩種方法,一種爲將類聲明爲Thread
的子類,將該子類重寫Thread
類的run
方法,接着分配和啓動該子類的實例;另一種方法是聲明實現Runnable
接口的類,而後實現run
方法。
線程嵌套類摘要:
// 線程的狀態 Thread.State // 當線程因未捕獲的異常而忽然終止時,調用的處理程序的接口 Thread.UncaughtExceptionHandler
通常方法:
// 構造方法 Thread() // 給線程指定一個名字 Thread(String threadName) // 線程所執行的代碼 void run() // 線程睡眠 void sleep() // 改變線程的名字 void setName(String threadName) // 得到線程的名字 String getName()
方法 | 說明 |
---|---|
currentThread() |
返回對當前正在執行的線程對象的引用 |
getId() |
返回該線程的標識符 |
getName() |
返回該線程的名稱 |
getPriority() |
返回該線程的優先級 |
線程是程序內部的一個控制流,它是由特定的生命週期的,線程的狀態表示了線程正在進行任務。
建立新的線程,線程建立後,進入到就緒狀態,等待start()
方法被調用,而後進入到運行狀態,在線程中能夠設置等待一個事件,該線程就會處於阻塞狀態,直到run()
方法結束,或調用stop()
方法後,線程就處於死亡狀態。
線程休眠
myThread.sleep(10000);
線程死亡
myThread.stop( );
多線程的執行,在棧內存中,每個線程都有屬於本身的棧內存空間,進行壓棧和彈棧,當線程結束時,該線程就會在棧內存中釋放。
線程中是具備優先級的,Java
提供了線程調度器來監控全部線程,經過線程調度器安排哪一個線程進行執行,優先級高的線程會在優先級低的線程以前先進行執行,優先級的分類:低(Thread.MIN_PRIORITY
),中(Thread. NORM_PRIORITY
),高(Thread.MAX_PRIORITY
)。
線程優先級的一些方法
// 得到線程的優先級 int getPriority() // 改變線程的優先級 void setPriority( int p )
線程是程序在運行中的執行單元,
Java
虛擬機時容許應用程序同時併發多個線程的,每一個線程獨有屬於本身的優先級,處於高優先級的線程是先於低優先級的線程進行執行。
class Ticket implements Runnable{ private int tickets = 100; public void run(){ ... } } class Demo{ Ticket t = new Ticket(); Thread t1 = new Thread(t); t1.start(); }
Java
、 Android
中的其餘知識 深刻講解 ,有興趣能夠繼續關注