Java學習(28)—(執行緒的控制/生命週期/解決安全問題)
執行緒的控制
休眠執行緒
public class ThreadSleep extends Thread {
@Override publicvoid run() {
for ( int x = 0; x < 100; x++) {
System. out .println(getName() + ":" + x + ", 日 期 : " + newDate());
// 睡眠
// 困了,我稍微休息 1 秒鐘try {
Thread. sleep (1000);
} catch (InterruptedException e)
{ e.printStackTrace();
}
}
}
}
加入執行緒
publicclass ThreadJoin extends Thread {
@Override publicvoid run() {
for ( int x = 0; x < 100; x++) {
System. out .println(getName() + ":" + x);
}
}
}
ThreadJoin tj1 = new ThreadJoin();
ThreadJoin tj2 = new ThreadJoin();
ThreadJoin tj3 = new ThreadJoin();
tj1.setName(" 李淵 " );
tj2.setName(" 李世民 " );
tj3.setName(" 李元霸 " );
tj1.start(); try {
// 李淵執行完,再執行其他兩個
tj1.join();
} catch (InterruptedException e) { e.printStackTrace();
}
tj2.start();
tj3.start();
禮讓執行緒
publicclass ThreadYield extends Thread {
@Override publicvoid run() {
for (int x = 0; x < 100; x++) {
System. out .println(getName() + ":" + x);
// 讓其他執行緒先走
Thread. yield ();
}
}
}
後臺執行緒
ThreadDaemon td1 = new ThreadDaemon();
ThreadDaemon td2 = new ThreadDaemon();
td1.setName(" 關羽 " );
td2.setName(" 張飛 " );
// 設定守護執行緒,主執行緒結束後,守護執行緒也會結束
td1.setDaemon(true); td2.setDaemon(true);
td1.start();
td2.start();
// 設 置 主 線 程 名 為 “ 劉 備 ”
Thread.currentThread().setName(" 劉備 " );
for ( int x = 0; x < 5; x++) {
System.out.println(Thread.currentThread().getName() + ":" + x);
}
終止執行緒
public class ThreadStop extends Thread {
@Override
public void run() {
System. out.println(" 開始執行: " +new Date());
// 我要休息 10 秒鐘,親,不要打擾我哦
try {
Thread.sleep(10000);
}catch(Interrupted Exception e) {
// e.printStackTrace();
System.out.println( " 執行緒被終止了" );
}
System. out .println(" 結束執行: " +new Date());
}
}
ThreadStop ts =new ThreadStop();
ts.start();
// 你超過三秒不醒過來,我就乾死你
try { Thread.sleep(3000);
// ts.stop(); ts.interrupt();
} catch (InterruptedException e)
{
e.printStackTrace();
}
執行緒的生命週期
多執行緒安全問題
判斷一個程式是否有執行緒安全問題的依據 )
A:是否有多執行緒環境
B:是否有共享資料
C:是否有多條語句操作共享資料
同步解決執行緒安全問題
同步程式碼塊
synchronized( 物件 ) {
需要被同步的程式碼 ;
}
這裡的鎖物件可以是任意物件。
synchronized(d) { if(tickets > 0) {
try { Thread.sleep(100);
} catch (InterruptedException e) { e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ " 正在出售第 " + (tickets--) + " 張 票 " );
}
}
同步方法
把同步加在方法上。這裡的鎖物件是 this
privatesynchronizedvoid sellTicket() { if(tickets > 0) {
try {
Thread.sleep(100);
} catch(InterruptedException e)
{ e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+" 正在出售第 " + (tickets--) + " 張 票 " );
}
}
靜態同步方法
把同步加在方法上。
這裡的鎖物件是當前類的位元組碼檔案物件(反射再講位元組碼檔案物件) private static synchronized void sellTicket() {
if (tickets > 0) {
try {
Thread.sleep(100);
}
catch(InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ " 正在出售第 " + (tickets--) +" 張票 " );
}
}
同步鎖物件
// 定義票
private int tickets = 100;
// 定義鎖物件
private Lock lock =new ReentrantLock();
@Override
public void run() {
while (true) {
try{
// 加鎖
lock.lock();
if (tickets > 0) {
try {
Thread.sleep(100);
}
catch(InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+ " 正在出售第 " + (tickets--) +" 張票 " );
}
}finally{
// 釋放鎖
lock.unlock();
}
}
}
同步的好處
同步的出現解決了多執行緒的安全問題。
同步的弊端
當執行緒相當多時,因為每個執行緒都會去判斷同步上的鎖,這是很耗費資源的, 無形中會降低程式的執行效率。
相關文章
- Java中多執行緒的概述、實現方式、執行緒控制、生命週期、多執行緒程式練習、安全問題的解決...Java執行緒
- Java—執行緒的生命週期及執行緒控制方法詳解Java執行緒
- Java多執行緒學習(1)建立執行緒與執行緒的生命週期Java執行緒
- Java執行緒的生命週期Java執行緒
- 【Java】【多執行緒】執行緒的生命週期Java執行緒
- Java之執行緒的生命週期Java執行緒
- iOS多執行緒全套:執行緒生命週期,多執行緒的四種解決方案,執行緒安全問題,GCD的使用,NSOperation的使用iOS執行緒GC
- 多執行緒-執行緒生命週期圖解執行緒圖解
- 【Java基礎】:執行緒的生命週期Java執行緒
- 死磕 java執行緒系列之執行緒的生命週期Java執行緒
- java中執行緒池的生命週期與執行緒中斷Java執行緒
- 圖解 Java 執行緒的生命週期,看完再也不怕面試官問了圖解Java執行緒面試
- JAVA面試題 執行緒的生命週期包括哪幾個階段?Java面試題執行緒
- 【原創】Java多執行緒初學者指南(4):執行緒的生命週期Java執行緒
- 見過描述得最好的Java執行緒生命週期Java執行緒
- 啃碎併發(二):Java執行緒的生命週期Java執行緒
- 建立執行緒的4種方法 and 執行緒的生命週期執行緒
- Java執行緒生命週期與狀態切換Java執行緒
- iOS執行緒生命週期的監控iOS執行緒
- Java中解決多執行緒資料安全問題Java執行緒
- Java面試必考題之執行緒的生命週期,結合原始碼,透徹講解!Java面試執行緒原始碼
- java執行緒安全問題Java執行緒
- Java多執行緒學習(2)執行緒控制Java執行緒
- Java指定週期執行執行緒Java執行緒
- react 學習--元件的生命週期(二)執行階段React元件
- 多執行緒的安全問題及解決方案執行緒
- 深入JAVA執行緒安全問題Java執行緒
- 多執行緒-執行緒安全問題的產生原因分析以及同步程式碼塊的方式解決執行緒安全問題執行緒
- 執行緒的【生命週期】和【執行緒的同步】(多視窗售票例子)執行緒
- Java併發程式設計實戰(5)- 執行緒生命週期Java程式設計執行緒
- Java 執行緒安全問題的本質Java執行緒
- Python執行緒安全問題及解決方法Python執行緒
- 執行緒的生命週期,真的沒那麼簡單執行緒
- 10 張圖聊聊執行緒的生命週期和常用 APIs執行緒API
- Java多執行緒中執行緒安全與鎖問題Java執行緒
- Java開發學習(五)----bean的生命週期JavaBean
- 學習vue生命週期Vue
- 【java 多執行緒】多執行緒併發同步問題及解決方法Java執行緒