線程總是存在優先級,優先級范圍在1~10之間,線程默認優先級是5; JVM線程調度程序是基於優先級的搶先調度機制; 在大多數情況下,當前運行的線程優先級將大於或等於線程池中任何線程的優先級
package unit_fifteen; public class TestPriority { public static void main(String[] args) { Thread tone = new ThreadOne(); // 線程的默認優先級為5,這里設置為10 tone.setPriority(10); // 獲取tone的優先級 System.out.println(tone.getPriority()); // 當前線程為Main()主線程 System.out.println(Thread.currentThread().getName()); tone.start(); Thread ttwo = new ThreadTwo(); ttwo.start(); } } class ThreadOne extends Thread { @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println("我是第" + i + "個阿三!"); System.out.println(Thread.currentThread().getName() + i); } } } class ThreadTwo extends Thread { @Override public void run() { for (int j = 0; j < 5; j++) { System.out.println("我是第" + j + "個李四!"); } } }
注意:當設計多線程應用程序的時候,一定不要依賴於線程的優先級。因為線程調度優先級操作是沒有保障的,只能把線程優先級作用作為一種提高程序效率的方法,但是要保證程序不依賴這種操作
Thread.sleep(long millis)和Thread.sleep(long millis, int nanos)靜態方法強制當前正在執行的線程休眠(暫停執行),以“減慢線程”。當線程睡眠時,它入睡在某個地方,在蘇醒之前不會返回到可運行狀態。當睡眠時間到期,則返回到可運行狀態;sleep()是靜態方法,只能控制當前正在運行的線程
package unit_fifteen; public class MyThread extends Thread { public void run() { for (int i = 0; i <=20; i++) { if ((i) % 10 == 0) { System.out.println("-------" + i); } System.out.print(i); try { //睡眠1秒 Thread.sleep(1000); System.out.print("線程睡眠1秒!\n"); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { new MyThread().start(); } }
Thread.yield()方法作用是:暫停當前正在執行的線程對象,並執行其他線程。yield()應該做的是讓當前運行線程回到可運行狀態,以允許具有相同優先級的其他線程獲得運行機會。因此,使用yield()的目的是讓相同優先級的線程之間能適當的輪轉執行。但是,實際中無法保證yield()達到讓步目的,因為讓步的線程還有可能被線程調度程序再次選中
Thread的非靜態方法join()讓一個線程B“加入”到另外一個線程A的尾部。在A執行完畢之前,B不能工作
package unit_fifteen; public class MyThread { public static void main(String[] args) { for (int i = 0; i < 5; i++) { new ThreadOneDemo().start(); if (i == 3) { try { // 調用join()方法 Thread t = new ThreadTwoDemo(); t.start(); t.join(); } catch (InterruptedException e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); } } } } } class ThreadOneDemo extends Thread { public void run() { System.out.println("我正在運行!"); } } class ThreadTwoDemo extends Thread { public void run() { for (int j = 0; j < 5; j++) { System.out.println("我是新加入者!"); } } }