JAVA多線程(一)------基本概念

     將最近學習的JAVA多線程知識在這裏進行總結和分享,以便以後查看。所有內容僅供參看,有不正確的地方歡迎指出。

一.基本概念

1.常見術語

  • 多線程:指的是這個程序(一個進程)運行時產生了不止一個線程
  • 並行:多個cpu實例或者多臺機器同時執行一段處理邏輯
  • 併發:通過cpu調度算法,不斷切換時間片,執行線程.當一個線程處在運行狀態時,其它線程處於掛起狀態
  • 線程安全:在併發情況下,一段邏輯經過多線程使用,線程的調度順序不影響最終結果。
  • 同步:使線程共享的資源始終保持一致和準確。

2.線程運行狀態

 

  • yield()方法:當前線程調用此方法,告訴cpu吧運行機會交給線程池中擁有相同優先級的線程。不保證一定能達到讓位的目的,讓步的線程可能再次被調度程度選中。yield()不會導致阻塞。
  • join()方法:當前線程裏調用其它線程的join方法,當前線程阻塞,但不釋放對象鎖,直到線程執行完畢或者到達設定的時間。

二.創建線程的四種方式

1.實現Runable接口實現run()方法

public class MyThread extends OtherClass implements Runnable {
public void run() {
System.out.println("MyThread.run()");
}
}

2.繼承Thread類重寫run方法。本質上是實現了 Runnable 接口的一個實例,通過 Thread類的 start() 實例方法。

public class MyThread extends Thread {
 public void run() { 
System.out.println("MyThread.run()"); 
} 
}
 MyThread myThread1 = new MyThread();
 MyThread myThread2 = new MyThread();
 myThread1.start();
 myThread2.start();

3.實現Callable 接口實現call()抽象方法,通過 FutureTask 包裝器創建帶返回值的線程(底層是實現了runnable接口和future接口)

public class Test  implements Callable<String> {

   public static void main(String[] args) throws ExecutionException, InterruptedException {
            Test callableDemo=new Test();
            FutureTask<Integer> result = new FutureTask(callableDemo);
            new Thread(result).start();
           System.out.println(result.get());
        }
        @Override
        public String call() throws Exception {
            int a=1;
            int b=2;
            System.out.println(a+b);
            return "執行結果:"+(a+b);
        }
}

4.線程池:提供了一個線程隊列,隊列中保存着所有等待狀態的線程。避免了創建與銷燬額外開銷,提高了響應的速度。

public class Test  implements Callable<String> {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //newFixedThreadPool創建固定大小的線程池
        ExecutorService executorService= Executors.newFixedThreadPool(1);
        Test callableDemo=new Test();
        Future<String> future=executorService.submit(callableDemo);
        System.out.println(future.get());
        //關閉線程池
        executorService.shutdown();
    }
    @Override
    public String call() throws Exception {
        int a=1;
        int b=2;
        System.out.println(a+b);
        return "執行結果:"+(a+b);
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章