多執行緒中的方法、兩種實現方式、匿名內部類建立多執行緒,執行緒安全問題的解決、
阿新 • • 發佈:2018-12-26
多執行緒兩種實現方式: 方式一: 繼承Thread類的方式 方式二: 實現Runnable介面的方式。
方式一: 步驟:
// 1. 定義一個類,然後繼承Thread
// 2. 重寫裡面的run方法,在run方法中定義執行緒要執行的任務
// 3. 在測試類中建立子類的物件。
// 4. 呼叫start方法,開啟執行緒。
public class MyThread extends Thread {//1.定義一個類繼承thread public MyThread(String name) { super(name); } publicMyThread() { } @Override public void run() {//2重寫裡面的run方法,定義執行緒要執行的任務 for (int i = 0; i < 100; i++) { System.out.println("Hello world" + i); Thread t=Thread.currentThread(); System.out.println(t.getName()); } } }
public class Demo01Thread { public static void方法2:main(String[] args) { System.out.println("main ....start"); MyThread md = new MyThread();//3.在測試類中建立子類的物件。 md.start(); // 4. 呼叫start方法,開啟執行緒 System.out.println("main....end"); } }
多執行緒的第二種實現方式: 實現Runnable介面的方式。 步驟: 1. 定義一個類,實現Runnable介面 2.重寫裡面的run方法,定義執行緒要執行的任務。 3. 在測試類中建立Runnable介面實現類物件 4. 再建立Thread物件,並且把Runnable介面實現類物件傳遞過去。 5. 呼叫start方法,開啟這個執行緒。 多執行緒兩種實現方式: 方式一: 繼承Thread類的方式 方式二: 實現Runnable介面的方式。 第二種方式的好處: 1. 解決了java中類與類之間只能單繼承的侷限性。 2. Runnable介面中只有一個run方法,沒有start,setName,sleep,getName等等等, Runnable介面 中的方法更加的純粹,我們只需要在裡面關注執行緒要執行的任務就可以了。更加符合設計模式中的單一職責原則。 3. 解耦 4. 可以更加方便的實現執行緒之間的資料共享。 */ public class Demo01Runnable { public static void main(String[] args) { //建立runnable介面類的實現物件 // Runnable r=new MyRunnableImpl(); //建立Thread類物件,並把runnable介面類的實現類物件傳遞過去 Thread t=new Thread(r); t.start();//呼叫start方法開啟這個執行緒 for (int i = 0; i < 100; i++) { System.out.println("執行緒:"+Thread.currentThread().getName()+"正在列印Hellojava"+i); } } } 多執行緒中的方法:
/* 多執行緒中的方法。Thread的構造方法 Thread(String name): 傳遞一個執行緒的名字。 Thread的其他方法 String getName(): 用來獲取執行緒的名字。 void setName(String name):設定執行緒的名字 static Thread currentThread():獲取當前正在執行的執行緒物件。 static void sleep(long millis):執行緒休眠,引數是休眠多少毫秒 */ public class Demo02ThreadMethod { public static void main(String[] args) { //建立thread子類物件 MyThread md = new MyThread("大白");//構造方法 md.setName("小白"); //呼叫start開啟執行緒 md.start(); //再建立一個新的執行緒並開啟 // new MyThread().start(); // new MyThread().start(); //獲取main執行緒名字並列印 //呼叫方法獲取當前正在執行的執行緒物件 //這個方法是通過哪個執行緒呼叫的,獲取的就是哪個執行緒物件。 Thread t = Thread.currentThread();//正在執行的程式 for (int i = 0; i < 100; i++) { System.out.println("main 執行緒的名字是:" + t.getName()); } } }
/* 使用匿名內部類的方式建立多執行緒。 匿名內部類格式: new 父類或者介面() { 重寫父類或介面的方法; } 匿名內部類真正建立的是子類物件。 */ public class Demo02ThreadInner { public static void main(String[] args) { /* Thread t=new Thread(new MyRunnableImpl());//匿名物件傳入引數 t.start();//分清楚匿名物件與匿名內部類區別 System.out.println("執行緒"+Thread.currentThread().getName()+"正在列印");*/ //匿名內部類作為引數傳入執行緒 Thread t = new Thread(new MyRunnableImpl() { @Override public void run() { System.out.println("執行緒" + Thread.currentThread().getName() + "正在列印"); } }); t.start(); //使用runnable介面方式建立新的執行緒並執行 Runnable r2 = new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName()+"正在列印" + ""); } }; new Thread(r2).start(); //使用匿名內部類加匿名物件 new Thread(new Runnable() { @Override public void run() { System.out.println(Thread.currentThread().getName() + "執行了"); } }).start(); /*resuleL: Thread-1正在列印 Thread-2執行了 執行緒Thread-0正在列印*/ } }