java多線程-1

1、多線程中,代碼的運行結果和執行順序是無關的。package com.alipay.thread;public class Thread1 extends Thread {@Overridepublic void run() {super.run();System.out.println("MyThread");}public static void main(String[] args) {Thread1 myThread = new Thread1();myThread.start();System.out.println("over");}}運行結果:會看到實際上run方法的執行時間比較晚。2、cpu調用線程是一個隨機調用,具有不確定性package com.alipay.thread;public class MyThread extends Thread {@Overridepublic void run() {try {for (int i = 0; i < 10; i++) {int time = (int) (Math.random() * 1000);Thread.sleep(time);System.out.println("run=" + Thread.currentThread().getName());}} catch (InterruptedException e) {e.printStackTrace();}}public static void main(String[] args) {try {MyThread myThread = new MyThread();myThread.setName("mythread");myThread.start();for (int i = 0; i < 10; i++) {int time = (int) (Math.random() * 1000);Thread.sleep(time);System.out.println("main=" + Thread.currentThread().getName());}} catch (InterruptedException e) {e.printStackTrace();}}}運行結果:實際上並不是有序的。代碼中的start()方法通知“線程規劃器”此線程已經準備就緒,等待調用線程對象的run方法,這個過程實際上是讓操作系統安排一個時間來調用線程中的run方法,也就是線程得到運行,啓動線程,具有異步執行的效果。如果不是調用start而是run,那就不是異步的而是同步的。這時候不是由“線程規劃器”來進行處理,而是有main主線程來調用run方法,也就是必須等到run方法中的代碼執行結束纔會執行下面的代碼。實際上,執行start方法並不代表線程啓動的順序例如:package com.alipay.thread;public class Thread2 extends Thread {private int i;public Thread2(int i) {this.i = i;}@Overridepublic void run() {System.out.println(i);}public static void main(String[] args) {Thread2 t1 = new Thread2(1);Thread2 t2 = new Thread2(2);Thread2 t3 = new Thread2(3);Thread2 t4 = new Thread2(4);Thread2 t5 = new Thread2(5);t1.start();t2.start();t3.start();t4.start();t5.start();}}執行結果:但是看這個代碼:package com.alipay.thread;public class Thread2 extends Thread {private int i;public Thread2(int i) {this.i = i;}@Overridepublic void run() {System.out.println(i);}public static void main(String[] args) {Thread2 t1 = new Thread2(1);Thread2 t2 = new Thread2(2);Thread2 t3 = new Thread2(3);Thread2 t4 = new Thread2(4);Thread2 t5 = new Thread2(5); /*t1.start();t2.start();t3.start();t4.start();t5.start();*/t1.run();t2.run();t3.run();t4.run();t5.run();}}執行結果就是:2、 isAlive() 方法判斷當前進程是否處於活動狀態活動狀態指的是線程已經啓動且尚未終止。線程處於正在運行或者準備開始運行狀態的,就認爲線程是存活的。在運行isAlive()方法的時候,如果將線程對象以構造參數的形式傳遞給Thread對象進行start()啓動時,運行的結果是會有差異的,這是由於currentThread和this的差異。package com.alipay.thread;public class Thread6 extends Thread {public Thread6() {System.out.println("coo:" + Thread.currentThread().getName());System.out.println("coothis:" + this.getName());}@Overridepublic void run() {System.out.println("coo1:" + Thread.currentThread().getName());System.out.println("coo1this:" + this.getName());}}package com.alipay.thread;public class Run {public static void main(String[] args) {Thread6 t6 = new Thread6();Thread t = new Thread(t6);t.setName("A");t.start();}}輸出結果:造成這樣的結果的原因是:currentThread()方法返回的是對當前正在執行的線程對象的引用,this代表的是當前調用它所在函數所屬的對象的引用。使用Thread.currentThread().getName()和使用this.getName(),都可以得到線程的名稱,但是使用this調用getName()方法只能在本類中,而不能在其他類中,更不能在Runnable接口中,所以只能使用Thread.currentThread().getName()獲取線程的名稱,否則會出現編譯時異常。3、sleep() 方法是讓正在執行的線程在指定的毫秒內休眠。正在執行的線程指的是this.currentThread()返回的線程。4、停止線程java中有三種方法可以停止線程:(1)run方法完成後線程正常終結;(2)stop方法終結,使用他們會產生不可預料的結果;(3)使用interrupt方法中斷線程,這個方法不會終止一個正在運行的線程,還需要加入一個判斷才能執行;使用interrupt()方法停止線程,只是在當前線程中打了一個停止的標記,並不是真的停止線程。判斷線程是否是停止狀態1)this.interrupt(): 測試當前線程是否已經中斷;public static boolean interrupt()2)this.isInterrupted(): 測試線程是否已經中斷; public boolean isInterrupted()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章