在java中可以進行多執行緒編程,在java標準庫中提供了一個Thread類,來表示執行緒操作。 Thread類別可以視為java標準函式庫提供的一組解決多執行緒程式設計的一組API.
建立好的Thread實例,和作業系統中的執行緒是一一對應的。作業系統提供了關於執行緒的API(C語言風格),java在對其進行封裝就成Thread類別。
class MyThread extends Thread{ @Override public void run() { //此时只是定义处理一个线程类,在系统中总是还没有创建出 新的线程。 System.out.println("hello thread"); } } public class TestDemo11 { public static void main(String[] args) { //创建线程 Thread t = new MyThread(); //启动线程,在系统中创建出了新的线程 t.start(); } }
執行緒之間是並發執行的
class MyThread3 extends Thread{ @Override public void run() { //定义一个线程类 while (true) { System.out.println("hello thread"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class TestDemo13 { public static void main(String[] args) { Thread t = new MyThread3(); t.start();//启动t线程 while(true){ System.out.println("hello main"); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
我們可以看到1s當執行一個執行緒中的程式碼之後
進入阻塞狀態,那麼下一秒要喚醒那個執行緒呢?
我們可以看到執行出來的兩個執行緒中列印出來的日誌的順序是不確定的。每一輪,1s之後,到底是喚醒thread線程還是喚醒main線程,這是不確定的。 (搶佔式執行),對於作業系統來說,從宏觀上對執行緒進行調度的順序是隨機的
此處在說明一下Thread.sleep()方法,sleep()這個方法到了ms等級沒有那麼精確。當呼叫這個方法之後,把線程強制處於中阻塞(睡眠狀態),但是當阻塞時間結束之後,並不是立即在cup上繼續執行該線程,如果Thread.sleep(1000),當通過1s後,阻塞時間結束,但是在1001ms,線程也許不會立即執行。也許作業系統中的cup在忙別的線程。或許該線程在1006ms才執行。
//Runnable其实就是描述一个任务 //创建一个类,实现Runnable接口,重写Runnable类中的run方法,在run()方法中,描述的是该线程要指向的哪些任务。 class MyThread2 implements Runnable{ @Override public void run() { System.out.println("hello thread"); } } public class TestDemo12 { public static void main(String[] args) { //创建线程,把创建好的Runnable实例传给Thread实例 Thread t = new Thread(new MyThread2()); t.start(); } }
方法三其實是方法一個的翻版,就是把上面的兩種程式碼,改成了匿名內部類別。
public class TestDemo14 { public static void main(String[] args) { Thread t1 = new MyThread(){ @Override public void run() { System.out.println("hello thread1"); } }; Thread t2 = new Thread(new Runnable() { @Override public void run() { System.out.println("hello thread2"); } }); t1.start(); t2.start(); } }
public class TestDemo15 { public static void main(String[] args) { //其实就是使用lambad表达式代替Runnable Thread t1 = new Thread(()->{ //()表示无参的run()方法 System.out.println("hello thread1"); }); } }
為了更方便的體現出多執行緒的好處,在這裡我們從0開始自增1,一直自增到10_0000_0000,使用串行方法,和並行方法,並且獲取他們執行程式碼的時間,進行比較。
public class TestDemo16 { public static void func1() throws InterruptedException { long big = System.currentTimeMillis(); //串行执行 Thread t = new Thread(()->{ long a = 0; for(long i = 0;i<10_0000_0000;i++){ a++; } }); t.start(); t.join(); long end = System.currentTimeMillis(); System.out.println("串行消耗时间:" + (end - big) + "ms"); } public static void func2() throws InterruptedException { long big = System.currentTimeMillis(); Thread t1 = new Thread(()->{ long b = 0; for(long i = 0;i< 10_0000_0000 / 2;i++){ b++; } }); t1.start(); Thread t2 = new Thread(()->{ long c = 0; for(long i = 0;i<10_0000_0000/ 2;i++){ c++; } }); t2.start(); t1.join(); t2.join(); long end = System.currentTimeMillis(); System.out.println("并行执行消耗时间:" + (end - big) + "ms"); } public static void main(String[] args) throws InterruptedException { func1();//串行执行 func2();//并行执行 } }
我們可以很明顯的看出串列時間要比並行時間長的多,而串列時間幾乎是並行時間的2倍。
Thread的常見建構方法
取得方法 | |
---|---|
getId() | |
getName( ) | |
getState() | |
##getPriority() | |
isDaemon() | |
執行緒是否被中斷 | |
以上是Java中Thread類別怎麼使用和它的屬性是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!