多執行緒---執行緒實現
阿新 • • 發佈:2020-08-16
並行和併發:
並行:在同一時刻,有多個指令在多個CPU上同時執行
併發:在同一時刻,有多個指令在單個CPU上交替執行
程序和執行緒:
程序:程序是正在執行的程式
- 是系統進行資源分配和呼叫的獨立單位
- 每一個程序都有它自己的記憶體空間和系統資源
執行緒:是程序中單個順序控制流,是一條執行路徑
關係:
單執行緒:一個程序如果只有一個執行緒,則成為單執行緒程式
多執行緒:一個程序如果有多個執行緒,則成為多執行緒程式
run()方法:
為什麼要重寫run();方法?
- 因為run();方法是用來封裝被執行緒執行的程式碼
run();方法和start();方法的區別:
- run();封裝執行緒執行的程式碼,直接呼叫相當於普通方法的呼叫,並沒有開啟執行緒
- start();啟動執行緒,然後由JVM呼叫此執行緒的run();方法
多執行緒的實現方式:
程式碼演示:
1 public class MyRunnable implements Runnable { 2 @Override 3 public void run() { 4 for(int i=0; i<100; i++) { 5 System.out.println(Thread.currentThread().getName()+":"+i); 6 } 7 } 8 } 9 publicclass MyRunnableDemo { 10 public static void main(String[] args) { 11 //建立MyRunnable類的物件 12 MyRunnable my = new MyRunnable(); 13 14 //建立Thread類的物件,把MyRunnable物件作為構造方法的引數 15 //Thread(Runnable target) 16 // Thread t1 = new Thread(my); 17 // Thread t2 = new Thread(my);18 //Thread(Runnable target, String name) 19 Thread t1 = new Thread(my,"坦克"); 20 Thread t2 = new Thread(my,"飛機"); 21 22 //啟動執行緒 23 t1.start(); 24 t2.start(); 25 } 26 }
程式碼演示:
1 public class MyCallable implements Callable<String> { 2 @Override 3 public String call() throws Exception { 4 for (int i = 0; i < 100; i++) { 5 System.out.println("跟女孩表白" + i); 6 } 7 //返回值就表示執行緒執行完畢之後的結果 8 return "答應"; 9 } 10 } 11 public class Demo { 12 public static void main(String[] args) throws ExecutionException, InterruptedException { 13 //執行緒開啟之後需要執行裡面的call方法 14 MyCallable mc = new MyCallable(); 15 16 //Thread t1 = new Thread(mc); 17 18 //可以獲取執行緒執行完畢之後的結果.也可以作為引數傳遞給Thread物件 19 FutureTask<String> ft = new FutureTask<>(mc); 20 21 //建立執行緒物件 22 Thread t1 = new Thread(ft); 23 24 String s = ft.get(); 25 //開啟執行緒 26 t1.start(); 27 28 //String s = ft.get(); 29 System.out.println(s); 30 } 31 }
三種實現方式的對比:
獲取當前執行緒物件:
Thread.currentThread;
sleep方法執行緒休眠:
程式碼如下:
1 public class MyRunnable implements Runnable { 2 @Override 3 public void run() { 4 for (int i = 0; i < 100; i++) { 5 try { 6 Thread.sleep(100); 7 } catch (InterruptedException e) { 8 e.printStackTrace(); 9 } 10 11 System.out.println(Thread.currentThread().getName() + "---" + i); 12 } 13 } 14 } 15 public class Demo { 16 public static void main(String[] args) throws InterruptedException { 17 /*System.out.println("睡覺前"); 18 Thread.sleep(3000); 19 System.out.println("睡醒了");*/ 20 21 MyRunnable mr = new MyRunnable(); 22 23 Thread t1 = new Thread(mr); 24 Thread t2 = new Thread(mr); 25 26 t1.start(); 27 t2.start(); 28 } 29 }
執行緒優先順序:
守護執行緒;
- void setDaemon(boolean on)
- 將此執行緒標記為守護執行緒,當執行的執行緒都是守護執行緒時,Java虛擬機器將退出
程式碼演示:
1 public class MyThread1 extends Thread { 2 @Override 3 public void run() { 4 for (int i = 0; i < 10; i++) { 5 System.out.println(getName() + "---" + i); 6 } 7 } 8 } 9 public class MyThread2 extends Thread { 10 @Override 11 public void run() { 12 for (int i = 0; i < 100; i++) { 13 System.out.println(getName() + "---" + i); 14 } 15 } 16 } 17 public class Demo { 18 public static void main(String[] args) { 19 MyThread1 t1 = new MyThread1(); 20 MyThread2 t2 = new MyThread2(); 21 22 t1.setName("女神"); 23 t2.setName("備胎"); 24 25 //把第二個執行緒設定為守護執行緒 26 //當普通執行緒執行完之後,那麼守護執行緒也沒有繼續執行下去的必要了. 27 t2.setDaemon(true); 28 29 t1.start(); 30 t2.start(); 31 } 32 }