java多執行緒初入3

2021-08-07 20:34:27 字數 1929 閱讀 4068

程序的概念

程序:官方的語言是計算機中的程式,關於某資料集合上的一次執行活動。使系統進行資源分配和排程的基本單位單位,是作業系統的基本單位,是作業系統結構的基礎。在現在的執行緒設計的計算機結構中,程序是執行緒的容器,程式是指令資料及組織形式的描述,程序是程式的實體,但是總的來說 程序是執行緒的容器。在平常我們也會說執行緒是輕量級的程序,是程式執行的最小單位。使用多執行緒而不是用多程序進行併發設計的原因執行緒間的切換與排程的成本遠小於程序

執行緒的生命週期

執行緒 狀態分為 new(新建立的),runnable(執行中),blocked(同步塊阻塞),waiting(等待無限時間的等待),timed_waiting(等待有限的時間 ),terminated(結束) 六種

執行緒的建立

thread

thread

=new

thread();

thread

.start();

//在這裡啟動後 會找到我們的run方法 去執行

終止執行緒

使用thread.stop 該方法停止執行緒。但是該方法會直接終止執行緒,並且將立即釋放這個執行緒所持有的鎖,而這些鎖是用來維持物件的唯一性的。如果資料寫入到一半 鎖時候後,另外乙個執行緒 就會讀取到該物件,但是這就讀取到了乙個不一致的物件這樣就會造成程式出現問題。

從圖中我們可知 物件有兩個屬性 分別為id 和name , 條件為當id和name 相等 時 物件是一致的,否則表示物件出錯。 我們的寫入執行緒總是把 id和name 寫成相同的值。 然後當我們在寫執行緒把id寫入到物件中的時候 ,突然執行stop 操作,那麼該物件的id就會變成1 而name仍然為別的數值,這樣就處於不一致的情況,寫執行緒在這個時候把鎖釋放後,讀執行緒爭取到鎖,開始讀取資料,這樣就讀取到了錯誤資料。 **如下

public

class

stopthreadunsafe

public

void

setid(int id)

public string getname()

public

void

setname(string name)

public

user()

public

user(int id, string name)

@override

public string tostring()

}public

static

class

changeobjectthread

extends

thread catch (exception e)

user.setname(string.valueof(v));

}thread.yield(); //相當於睡眠,不過 只是 讓同優先順序別的執行緒有執行的機會 。 並且不能指定 暫停多長時間}}

顯示的結果不一致,就是讀鎖 讀到內容不一樣。

java初入多執行緒7

同步控制 synchronized 擴充套件 重入鎖 public static reentrantlock looklock new reentrantlock public static int i 0 public void run catch exception e finally publ...

java初入多執行緒10

執行緒阻塞工具類 locksupport public class locksupportdemo override public void run public static void main string args throws exception public class locksuppo...

java初入多執行緒12

自定義執行緒建立 threadfactory 我們原先用的執行緒池threadpoolexecutor 裡面的執行緒都是從threadfactory 建立的。2.作用 我們可以根據自定義執行緒池,幫助我們跟蹤執行緒池建立了多少個執行緒,也可以自定義執行緒的名稱,組以及優先順序等資訊。甚至可以將所有執...