【Kay】Java多线程
生活随笔
收集整理的這篇文章主要介紹了
【Kay】Java多线程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
* 多線程的創建
? 方式一:繼承Thread類* 1. 創建一個繼承于Thread類的子類* 2. 重寫Thread類的run() --> 將此線程執行的操作聲明在run()中* 3. 創建該子類的對象* 4. 調用start()* 例子:遍歷100以內的所有的偶數
class MyThread extends Thread {@Overridepublic void run() {for (int i = 1; i <= 100; i++) {if (i % 2 == 0) {try {sleep(1000); // 單位是1000毫秒 = 1s} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + ":" + i);}if (i % 20 == 0) {yield();}}}
}public class ThreadTest{public static void main(String[] args) {MyThread t = new MyThread();t.setName("多線程哦");t.setPriority(Thread.MAX_PRIORITY); //設置分線程的優先級t.start();//進入多線程//以下是主進程Thread.currentThread().setName("主線程哦");for (int i = 1; i <= 100; i++) {if (i % 2 == 0) {System.out.println(Thread.currentThread().getName());//調取當前線程名字}}}}
/** Thread中的常用方法:* 1. start():啟動當前線程;調用當前線程的run()* 2. run(): 通常需要重寫Thread類中的此方法,將創建的線程要執行的操作聲明在此方法中* 3. currentThread():返回執行當前代碼的線程* 4. getName():獲取當前線程的名字* 5. setName():設置當前線程的名字* 6. yield():釋放當前cpu的執行權* 7. join():在線程a中調用線程b的join(),此時線程a就進入阻塞狀態,直到線程b完全執行完以后,線程a才結束阻塞狀態* 9. sleep(long millitime):讓當前線程“睡眠”指定的millitime毫秒。在指定的millitime毫秒時間內,當前* 線程是阻塞狀態。* 10. isAlive():判斷當前線程是否存活*** 線程的優先級:* 1.MAX_PRIORITY:10* MIN _PRIORITY:1* NORM_PRIORITY:5 -->默認優先級* 2.如何獲取和設置當前線程的優先級:* getPriority():獲取線程的優先級* setPriority(int p):設置線程的優先級** 說明:高優先級的線程要搶占低優先級線程cpu的執行權。但是只是從概率上講,高優先級的線程高概率的情況下* 被執行。并不意味著只有當高優先級的線程執行完以后,低優先級的線程才執行。*
*/
/*多線程的創建
方式二:用Runnable接口
①創建一個類,實現Runnable接口
②實現Runnable中的run()方法
③創建實現①中類的對象
④將此對象作為參數傳入Thread構造器中,創建Thread類的對象*///創建三個窗口賣票,總票數為100張(用Runnable接口)
class Window implements Runnable{private int ticket = 100;@Overridepublic void run() {while (true){if (ticket>0){System.out.println(Thread.currentThread().getName() + "賣票:票號為:"+ticket);ticket--;}else{break;}}}
}public class WindowRunnable {public static void main(String[] args) {Window ww = new Window();Thread t11 = new Thread(ww); //將Runnable對象ww和Thread對象t11相關聯Thread t22 = new Thread(ww);t11.setName("窗口一");t22.setName("窗口二");t11.start(); //Thread對象t11調用start();t22.start();}
}//注意:用Runnable不需要加static,因為制造了一個Window對象ww,三個線程都用的這個對象。
*如何解決多線程存在的安全問題
對多個線程共享數據的語句,Java可以通過同步機制來解決,即讓一個線程都執行完,在執行過程中,其他線程不可以參與執行。
1.同步代碼塊
synchronized(對象){ //需要被同步的代碼; }2.放在方法聲明中同步方法
public synchronized void show (String name){ …. }*什么是死鎖?如何解決?
不同的線程分別占用對方需要的同步資源,都在等待對方放棄自己需要的同步資源,就形成了線程的死鎖。出現死鎖后,不會出現異常和提示,只是所有的線程都處于阻塞狀態,無法繼續
解決方法:
1、過顯式定義同步鎖對象來實現同步。Lock接口中的鎖提供了對共享資源的獨占訪問,每次只能有一個線程對Lock對象加鎖,線程訪問共享資源之前應先獲得Lock對象
2、盡量減少同步資源的定義,盡量避免嵌套同步
總結
以上是生活随笔為你收集整理的【Kay】Java多线程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Adobe Premiere Pro快速
- 下一篇: MySQL 一键卸载