Java面向對象中的多線程 多線程 在 面向對象中的多線程中,要理解多線程的知識點,首先要掌握什麼是進程,什麼是線程?為什麼有多線程呢?多線程存在的意義有什麼什麼呢?線程的創建方式又有哪些?以及要理解多線程的特點等。 多線程和線程的理解 多線程?線程,多個線程,如何理解什麼是進程呢? 如圖: 任務管 ...
Java面向對象中的多線程
多線程
在Java
面向對象中的多線程中,要理解多線程的知識點,首先要掌握什麼是進程,什麼是線程?為什麼有多線程呢?多線程存在的意義有什麼什麼呢?線程的創建方式又有哪些?以及要理解多線程的特點等。
多線程和線程的理解
多線程?線程,多個線程,如何理解什麼是進程呢?
如圖:
任務管理器中有個進程,下麵列表的則是正在進行中的任務程式,都屬於進程(正在執行中的程式),那麼具體的進程是什麼?進程實質是:應用程式在記憶體中運行的所占空間。
可以理解為一個空間,當一個應用程式啟動時,就為一個進程,如qq
的啟動,可以為一個進程,(簡單理解正在進行的應用程式),那麼我們在玩qq
的時候,進行聊天,那麼這個聊天為進程中的線程,即為一個執行單元,那麼這個應用程式不僅只有一個線程,一個進程可以有多個線程,那麼這個應用程式就被稱為多線程程式。
多線程,你在玩qq
的時候,是不是同時和其他人聊天呢?即為多線程嘛,可以這麼理解。多線程同時處理問題,和執行任務。
一個進程中至少有一個線程
一個應用程式啟動了多線程,可以實現多個任務同時執行,這也就是Java中的併發概念。
多線程的原理
多線程是如何使用的呢?多線程的使用可以合理的安排cpu
的調用,多線程會導致程式的性能降低,多線程是靠cpu
內部處理快速切換完成的。
案例
主方法的運行,主線程運行負責,start
方法開啟一個線程
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()
多線程的優點
- 多線程編程比較簡單,效率也高,可以共用數據和資源
- 適合開發服務的程式,如聊天等
- 適合開發有多種交互的介面程式等
線程類(Thread)及其方法
多線程中的一些概念,程式指用靜態的電腦語言編寫的代碼程式,多進程指在操作系統中有多個程式同時執行,那麼多線程是指在程式中有多個線程同時執行咯~
再次強調:一個進程中至少要有一個線程,一個進程可以有多個線程
線程的創建:
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
中的其他知識 深入講解 ,有興趣可以繼續關註 - 小禮物走一走 or 點贊