1. 程式人生 > 實用技巧 >多執行緒---執行緒實現

多執行緒---執行緒實現

並行和併發:

並行:在同一時刻,有多個指令在多個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 public
class 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 }