1. 程式人生 > >多執行緒中的方法、兩種實現方式、匿名內部類建立多執行緒,執行緒安全問題的解決、

多執行緒中的方法、兩種實現方式、匿名內部類建立多執行緒,執行緒安全問題的解決、

多執行緒兩種實現方式:
    方式一: 繼承Thread類的方式
    方式二: 實現Runnable介面的方式
方式一: 步驟:
   // 1. 定義一個類,然後繼承Thread
   // 2. 重寫裡面的run方法,在run方法中定義執行緒要執行的任務
   // 3. 在測試類中建立子類的物件。
   // 4. 呼叫start方法,開啟執行緒。
public class MyThread extends Thread {//1.定義一個類繼承thread
    public MyThread(String name) {
        super(name);
    }
    public 
MyThread() { } @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 
main(String[] args) { System.out.println("main ....start"); MyThread md = new MyThread();//3.在測試類中建立子類的物件。 md.start(); // 4. 呼叫start方法,開啟執行緒 System.out.println("main....end"); } }
方法2:
多執行緒的第二種實現方式: 實現Runnable介面的方式。
 步驟:        1. 定義一個類,實現Runnable介面        2. 
重寫裡面的run方法,定義執行緒要執行的任務。
3. 在測試類中建立Runnable介面實現類物件 4. 再建立Thread物件,並且把Runnable介面實現類物件傳遞過去。 5. 呼叫start方法,開啟這個執行緒。 多執行緒兩種實現方式: 方式一: 繼承Thread類的方式 方式二: 實現Runnable介面的方式。 第二種方式的好處: 1. 解決了java中類與類之間只能單繼承的侷限性。 2. Runnable介面中只有一個run方法,沒有startsetNamesleepgetName等等等, 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正在列印*/
}
}