java多執行緒與實現方式

2021-07-06 06:03:33 字數 3353 閱讀 6379

執行緒建立有兩種形式:

1:實現runnable介面--在thread構造中建立實現了runnable介面的類--呼叫start方法

2:從thread類繼承並重寫run方法(在main函式中就不需要new thread了,直接呼叫start方法)

【執行緒建立方法一:繼承thread】

public class demo }}

class thread1 extends thread}}

【為什麼要覆蓋run方法】

該類定義了乙個功能,儲存要執行**的,該儲存功能就叫做run方法

主線程中儲存**的地方是main方法,其他執行緒內儲存**的地方是run方法

start方法啟動執行緒並執行run方法

public class demo }}

class thread1 extends thread

/*string name;

thread1(string name)*/

public void run()}}

【建立執行緒第二種方法:實現runnable介面】

package demo;

public class demo

}class thread1 implements runnable}}

問題:為什麼要將runnable子類物件作為引數傳遞給tread建構函式

答:因為自定義run方法實現所屬的物件是runnable介面子類物件,所以要啟用run方法,就必須明確該run方法所屬物件

問題:當乙個執行緒將共享資料沒有執行完時,其他執行緒參與進來,會導致執行緒安全問題

解決辦法:同步**塊 synchronized(物件)

package demo;

public class demo

}class thread1 implements runnable

public synchronized void add(int n)catch(exception e){}

system.out.println(thread.currentthread().getname()+"--"+sum);}}

}【函式需要被物件呼叫,函式都有乙個所屬物件呼叫即this,所以同步物件的鎖是this】

package demo;

public class demo

}class thread1 implements runnablecatch(exception e){}

system.out.println(thread.currentthread().getname()+"-code-"+sum);}}

else

}public synchronized void add()catch(exception e){}

system.out.println(thread.currentthread().getname()+"-add-"+sum);}}

}【靜態同步物件鎖是class】

如果同步函式被靜態修飾後使用的鎖不再是this,因為靜態方法中不可以定義this

靜態進記憶體時,記憶體中沒有本類物件,但有本類對應的位元組碼檔案物件,即類名.class,該物件的型別是class

package demo;

public class demo

}class thread1 implements runnablecatch(exception e){}

system.out.println(thread.currentthread().getname()+"-code-"+sum);}}

else

}public static synchronized void add()catch(exception e){}

system.out.println(thread.currentthread().getname()+"-add-"+sum);}}

}【設計模式】

【餓漢式】

class single

public static single getinstant()

}【懶漢式】物件延遲載入

class single;

public static  singel getinstant()}}

else return single;}}

【編寫乙個死鎖程式】

package demo;

public class demo

}class deadlock implements runnable

@override

public void run() }}

}else}}

}}}class lock

【執行緒間通訊】

多個執行緒操作同乙個資源,操作動作不同

【等待喚醒】

wait() notify() notifyall() 都用在同步中,因為要對持有鎖的執行緒操作

為什麼這些操作執行緒的方法要定義在object中:

因為鎖可以使任意物件,任意物件可以呼叫的方法應定義在object中

【生產者消費者】

package demo;

public class demo

}class producer implements runnable

@override

public void run() }}

class consumer implements runnable

@override

public void run() }}

class res catch (interruptedexception e)

}this.name = name+"--"+count++;

system.out.println(thread.currentthread().getname()+"...生產者..."+this.name);

flag = true;

this.notifyall();

}public synchronized void out() catch (interruptedexception e)

system.out.println(thread.currentthread().getname()+"...消費者......"+this.name);

flag = false;

this.notifyall();}}

【其他方法】

interrupt() 當沒有指定方法讓凍結的執行緒恢復,對凍結的執行緒進行清除(會出現出現exception 可以在catch中進行操作結束執行緒)

join() 請求cpu直至該執行緒結束

setdaemon() 設定為後台執行緒

setpriority(thread.max_priority)

yield() 臨時釋放執行權

Java多執行緒的實現方式

多執行緒有3種實現的方法 繼承thread 類建立執行緒 實現了runnable介面介面建立執行緒 通過可callable和futrue建立執行緒 第一種 繼承thread類建立執行緒,步驟如下 建立乙個thread類的子類。覆蓋thread類的run 中的方法。建立所定義的子類的乙個物件。呼叫該物...

java多執行緒都有幾種方式實現

有三種 1 繼承thread類,重寫run函式 建立 class xx extends thread 開啟執行緒 物件.start 啟動執行緒,run函式執行 2 實現runnable介面,重寫run函式 開啟執行緒 thread t new thread 物件 建立執行緒物件 t.start 3 ...

Java多執行緒之實現方式

1.方式 繼承thread類,實現runnable介面。2.啟動方式 start方法 申請新執行緒來執行run方法 run方法 在原來執行緒執行run方法,普通的方法呼叫 3.舉例 繼承thread類 class threadthread extends thread 實現runnale介面 cla...