第35節:Java面向對象中的多線程

標題圖

Java面向對象中的多線程

多線程

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()

多線程的優勢

  • 多線程編程比較簡單,效率也高,能夠共享數據和資源
  • 適合開發服務的程序,如聊天等
  • 適合開發有多種交互的接口程序等

線程類(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();
  1. 聲明一個 Thread 類的子類,覆蓋run()方法,建立子類對象,就是建立線程對象,而後調用start方法(開啓線程讓線程去執行,而後讓jvm調用run方法)。
  2. 聲明一個實現 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();
}

結語

  • 下面我將繼續對JavaAndroid中的其餘知識 深刻講解 ,有興趣能夠繼續關注
  • 小禮物走一走 or 點贊
相關文章
相關標籤/搜索