執行緒基礎 執行緒之間的共享和協作(進一步認識Java裡的執行緒)
阿新 • • 發佈:2020-09-15
執行緒常用方法和執行緒的狀態
執行緒的生命週期圖,及其呼叫執行緒的方法會改變的狀態
呼叫run和start()的區別
package org.dance.day1; import org.dance.tools.SleepTools; /** * 執行緒呼叫 run 和 start 方法的區別 * @author ZYGisComputer */ public class StartAndRun { /** * 繼承Thread類 */ private static class ThreadRun extends Thread{ @Overridepublic void run() { int i = 90; while (i>0){ SleepTools.ms(1000); System.out.println("I am "+Thread.currentThread().getName()+" and now the i = "+ i); i--; } } } public static void main(String[] args) {// 執行run // executeRun(); // 執行start executeStart(); } public static void executeRun(){ ThreadRun thread = new ThreadRun(); thread.setName("run"); // 呼叫執行緒的Run方法 thread.run(); // 執行結果 // I am main and now the i = 90 } publicstatic void executeStart(){ ThreadRun thread = new ThreadRun(); thread.setName("run"); // 呼叫執行緒的Run方法 thread.start(); // 執行結果 // I am run and now the i = 90 } }
SleepTools.java這個只是一個小工具類,用於執行緒休眠的
package org.dance.tools; import java.util.concurrent.TimeUnit; /** * 類說明:執行緒休眠輔助工具類 */ public class SleepTools { /** * 按秒休眠 * @param seconds 秒數 */ public static final void second(int seconds) { try { TimeUnit.SECONDS.sleep(seconds); } catch (InterruptedException e) { } } /** * 按毫秒數休眠 * @param seconds 毫秒數 */ public static final void ms(int seconds) { try { TimeUnit.MILLISECONDS.sleep(seconds); } catch (InterruptedException e) { } } }
執行緒的優先順序:
取值為1~10,預設為5,但是執行緒的優先順序並不可靠,不建議作為執行緒開發時候的手段,因為有的作業系統可能會忽略執行緒的執行優先順序,所以開發中需要將這個不確定因素列如其中
設定執行緒的優先順序方法,在原始碼中可以看見最小是1預設是5最大是10大於或者小於報錯
/** * The minimum priority that a thread can have. */ public final static int MIN_PRIORITY = 1; /** * The default priority that is assigned to a thread. */ public final static int NORM_PRIORITY = 5; /** * The maximum priority that a thread can have. */ public final static int MAX_PRIORITY = 10; public final void setPriority(int newPriority) { ThreadGroup g; checkAccess();
if (newPriority > MAX_PRIORITY || newPriority < MIN_PRIORITY) { throw new IllegalArgumentException(); } if((g = getThreadGroup()) != null) { if (newPriority > g.getMaxPriority()) { newPriority = g.getMaxPriority(); } setPriority0(priority = newPriority); } }
守護執行緒:
和主執行緒共死,finally不能保證一定會執行
package org.dance.day1; import org.dance.tools.SleepTools; /** * 守護執行緒 * @author ZYGisComputer */ public class DaemonThread { /** * 繼承Thread類 */ private static class UseThread extends Thread { public UseThread(String threadName) { super(threadName); } @Override public void run() { try { String name = Thread.currentThread().getName(); while (!isInterrupted()) { System.out.println("當前執行緒:" + name); } System.out.println(name + " interrupt flag is " + isInterrupted()); } finally { System.out.println("執行 finally"); } } } public static void main(String[] args) { // 執行不是守護執行緒 // noDaemon(); // 執行守護執行緒 daemon(); // 對比之下就可以看到 // 不是守護執行緒 需要中斷 主執行緒執行完畢之後不會停止 finally語句塊一定會執行 // 守護執行緒 主執行緒執行完畢立即停止 finally語句塊不一定會執行 } public static void noDaemon(){ UseThread useThread = new UseThread("DaemonThread"); useThread.start(); SleepTools.ms(5); useThread.interrupt(); } public static void daemon(){ UseThread useThread = new UseThread("DaemonThread"); useThread.setDaemon(true); useThread.start(); SleepTools.ms(5); } }
yield()方法
讓出CPU的執行權,將執行緒的狀態從執行轉到可執行狀態,但是下個時間片,該執行緒依然有可能被再次選中執行
作者:彼岸舞
時間:2020\09\15
內容關於:併發程式設計
本文來源於網路,只做技術分享,一概不負任何責任