執行緒 threads
執行緒是認證考試中考的最多的一部分
簡單的說,就是一個程式它可以有好幾個分身在電腦中執行。
1.程式與執行緒
程式:執行中的程式叫做程式,即當程式執行時的這個動態過程就是一個程式。
在電腦中同一個份程式可以執行好幾個,就是說好幾個工作相同的程式在電腦中執行。
執行緒:相同的程式碼產生好幾個程式,有個問題就是一些東西重複浪費,一樣的程式程式碼總有能夠共用的程式碼、常量等。
threads就是使同一份程式產生好幾個程式的效果,不同的threads之間能夠達到某種程度的資源共享,threads是輕量級的程式。
2.Java中負責threads功能是類是:java.lang.Threads
實現方式有兩種:一是繼承;二是介面
1)繼承——這種方式比較單一簡單,因為java的類只能單一繼承,繼承了Threads類,就無法繼承別的類了
2)介面——實現Runnable介面,符合物件導向設計精神,可以繼承多個介面
繼承:Hello1.java
public class Hello1 extends Threads
{
String name ;
public Hello1 (String n)
{
name = n ;
}
public void run()
{
for(int i = 1 ; i <= 10 ;i++)
{
System.out.println(name + "Hello" + i)
}
}
}
介面:Hello2.java
public class Hello2 implement Runnable
{
String name ;
public Hello2 (String n)
{
name = n ;
}
public void run()
{
for(int i = 1 ; i <= 10 ;i++)
{
System.out.println(name + "Hello" + i)
}
}
}
執行執行緒:
public class ThreadsExample
{
public static void main(String argv[])
{
Hello1 h1 = new Hello1("Threads1") ; 建立類物件例項
Threads t1 = new Threads(h1) ; 建立執行緒物件例項
t1.start() ; 執行執行緒
//Hello2的執行同上
//main本身也是一個Threads
}
}
停止執行緒:
public void run()
{
int i = 0 ;
while(!isStop)
{
i++ ;
System.out.println(name + "Hello" + i)
}
public void stop()
{
isStop = true ;
}
}
新增了一個isStop屬性用於控制迴圈條件,一但停止了執行緒將無法恢復,只能重新產生另一個Threads物件
暫停Threads執行:
1)sleep
數字鐘例項MyClock.java
public void run()
{
while(true)
{
try
{
Thread.sleep(1000);
time.setText(getTime) ;
}
catch
{
System.err.println(e);
}
}
}
Threads物件睡醒後,程式等待執行狀態,而不是立刻執行狀態
2)yield
讓Threads物件立刻暫時停止執行,並且直接從執行狀態轉移到等待執行狀態
3)join
當一個系統中有好幾個Threads在執行,有時候某個Threads甲需要等待另外一個Threads乙完成某件事情後,甲才能繼續執行下去,這時甲在乙還沒有執行能夠完成之前,就必須要做等待的工作
3.鎖
多個執行緒之間共享一些資源物件,例如銀行帳號在各賬戶之間轉移賬目,各賬戶資料就是共享資源物件;撲克遊戲、棋子游戲中各個玩家對撲克棋子不斷進行操作,這些撲克和棋子就是共享資源物件
Java中用關鍵字synchronized為共享資源加鎖。用synchronized修飾一個物件時,在任何一個時刻只能有一個執行緒訪問,即只能有一個執行緒能取得加鎖物件的鑰匙,對加鎖物件進行操作,只有該執行緒操作完畢後,其他執行緒才能訪問該物件,進行操作,從而達到對共享資源訪問的保護。
給物件加鎖的方式有2種:1是給方法加鎖,2是給方法體中的某些物件加鎖
1)
public synchronized 返回值型別 方法名(引數列表)
{
...;
//定義處理共享資源列表
}
2)
public 返回值型別 方法名(引數列表)
{
...;//定義對非共享資源的訪問
synchronized(this) //定義對共享資源的訪問
{
...; //被加鎖的某些共享的物件或資料
}
}
鎖的喚醒:執行緒同步和喚醒方法
wait()方法使執行緒一直等待下去
wait(1000)方法使執行緒等待1000毫秒後又成為就緒狀態
notify()方法喚醒沒有指定等待時間的執行緒
notifyAll()使用者喚醒多個執行了wait()方法而等待的執行緒
方法wait()和sleep()和suspend()方法一樣,都能使執行緒等待而停止執行,其區別在於sleep()方法和suspend()方法不會釋放物件的鎖,而wait()方法進入等待時,可是釋放物件的鎖
另外還有三種方式也會把鎖釋放:1是用break語句跳離鎖定語句塊,這對synchronized宣告的方法無作用;2是遇到return語句;3是遇到異常
簡單預防死鎖的辦法就是給每個鎖加上優先順序
相關文章
- Node.js 真·多執行緒 Worker Threads 初探Node.js執行緒thread
- Java 21 新特性:虛擬執行緒(Virtual Threads)Java執行緒thread
- Introduction to processes and threads(執行緒與程式的區別)thread執行緒
- nodejs中使用worker_threads來建立新的執行緒NodeJSthread執行緒
- 程式和執行緒有什麼區別?(Process and Threads)程式之間和執行緒之間是如何通訊的?執行緒thread
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- 多執行緒-執行緒控制之休眠執行緒執行緒
- 多執行緒-執行緒控制之加入執行緒執行緒
- 多執行緒-執行緒控制之禮讓執行緒執行緒
- 多執行緒-執行緒控制之中斷執行緒執行緒
- 多執行緒-執行緒控制之守護執行緒執行緒
- 執行緒和執行緒池執行緒
- 多執行緒【執行緒池】執行緒
- 多執行緒--執行緒管理執行緒
- Java多執行緒——執行緒Java執行緒
- 執行緒 執行緒池 Task執行緒
- 執行緒與多執行緒執行緒
- 保證執行緒在主執行緒執行執行緒
- 多執行緒之初識執行緒執行緒
- Java多執行緒-執行緒中止Java執行緒
- 執行緒控制之休眠執行緒執行緒
- Java多執行緒——執行緒池Java執行緒
- c#執行緒-執行緒同步C#執行緒
- 多執行緒-執行緒概述等執行緒
- 執行緒1-單執行緒執行緒
- 執行緒3--執行緒安全執行緒
- 執行緒同步及執行緒鎖執行緒
- Java執行緒:執行緒中斷Java執行緒
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- 執行緒、開啟執行緒的兩種方式、執行緒下的Join方法、守護執行緒執行緒
- java執行緒之守護執行緒和使用者執行緒Java執行緒
- 執行緒(一)——執行緒,執行緒池,Task概念+程式碼實踐執行緒
- java 多執行緒守護執行緒Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒(2)執行緒鎖Java執行緒
- java多執行緒9:執行緒池Java執行緒
- 二. 執行緒管理之執行緒池執行緒