多執行緒之建立執行緒
阿新 • • 發佈:2022-12-06
多執行緒
- 程序
- 在作業系統中執行的程式就是程序,程序就是執行程式的一次執行過程,它是一個動態的概念式系統資源分配的單位
- 通常再一個程序中可以包含若干個執行緒,當然一個程序中至少有一個執行緒,不然沒有存在的意義,執行緒是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(); } }