1. 程式人生 > 其它 >多執行緒之建立執行緒

多執行緒之建立執行緒

多執行緒

  • 程序
    • 在作業系統中執行的程式就是程序,程序就是執行程式的一次執行過程,它是一個動態的概念式系統資源分配的單位
    • 通常再一個程序中可以包含若干個執行緒,當然一個程序中至少有一個執行緒,不然沒有存在的意義,執行緒是CPU排程和執行的單位
  • 執行緒
    • 執行緒就是獨立的執行路徑
    • 在程式執行時,即使沒有自己建立執行緒,後臺也會有多個執行緒,比如主執行緒,GC執行緒
    • main()稱之為主執行緒,為系統的入口,用於執行整個程式
    • 在一個程序中,如果開闢了多個執行緒,執行緒的執行是由排程器安排排程的,排程器是與作業系統緊密相關的,先後順序是不能人為干預的
    • 對同一份資源操作時,會存在資源搶奪的問題,需要加入併發控制
    • 執行緒會帶來額外的開銷,如CPU排程時間,併發控制開銷
    • 每個執行緒在自己的工作記憶體互動,記憶體控制不當會造成資料不一致
  • 多執行緒
    • 多條執行路徑,主執行緒與子執行緒並行交替執行(普通方法只有主執行緒一條路徑)

執行緒的建立(重要)

  • ·Thread class 繼承Thread類(重點)

    • 自定義執行緒類,繼承Thread類

    • 重寫run()方法,編寫執行緒執行體

    • 在主函式中建立一個執行緒物件,呼叫start()方法開啟執行緒。

    • package com.fjbc.多執行緒;
      // 建立執行緒方式一:繼承Thread類,重寫run()方法,呼叫start開啟執行緒
      // 總結:注意,執行緒開啟不一定立即執行,由CPU排程執行
      
      public class TestThread extends Thread {
          @Override
          public void run() {
              //run方法執行緒方法體
              for (int i = 0; i < 20; i++) {
                  System.out.println("我在看程式碼----" + i);
              }
          }
      
          public static void main(String[] args) {
      
              //建立一個執行緒物件
              TestThread testThread = new TestThread();
      
              //start開啟執行緒
              testThread.start();
              
              //主執行緒
              for (int i = 0; i < 200; i++) {
                  System.out.println("我在學習多執行緒-----" + i);
              }
          }
      }
      
  • Runnable介面 實現Runnable介面(重點)

    package com.fjbc.多執行緒;
    
    public class TestThread2 implements Runnable {
        @Override
        public void run() {
            //run方法執行緒方法體
            for (int i = 0; i < 20; i++) {
                System.out.println("我在看程式碼----" + i);
            }
        }
    
        public static void main(String[] args) {
    
            //建立一個執行緒物件
            TestThread2 testThread2 = new TestThread2();
    
            //建立執行緒物件,通過執行緒物件來開啟執行緒,代理
    //        Thread thread = new Thread(testThread2);
    //
    //        //start開啟執行緒
    //        thread.start();
            new Thread(testThread2).start();
    
            //主執行緒
            for (int i = 0; i < 200; i++) {
                System.out.println("我在學習多執行緒-----" + i);
            }
        }
    }
    
    
  • Callable介面 實現Callable介面(瞭解)

    package com.fjbc.多執行緒;
    
    
    import java.util.concurrent.*;
    
    public class TestCallable2 implements Callable<Boolean> {
        @Override
        public Boolean call() throws Exception {
            System.out.println("建立成功");
            return true;
        }
    
        public static void main(String[] args) {
            TestCallable2 callable = new TestCallable2();
    
            //建立執行服務
            ExecutorService service = Executors.newFixedThreadPool(1);
            //提交執行
            Future<Boolean> result = service.submit(callable);
    
            try {
                boolean isTrue = result.get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
            service.shutdownNow();
        }
    }