久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網
      最全最豐富的資訊網站

      java多線程的創(chuàng)建及啟動

      java多線程的創(chuàng)建及啟動

      Java中線程的創(chuàng)建常見有如三種基本形式:

      一、繼承Thread類,重寫該類的run()方法

      繼承Thread類,重寫該類的run()方法

      public class MyThread extends Thread{     @Override     public void run() {         for (int i = 0 ;i < 50;i++) {             System.out.println(Thread.currentThread().getName() + ":" + i);         }     }     public static void main(String[] args) {         for (int i = 0;i<50;i++) {             //調用Thread類的currentThread()方法獲取當前線程             System.out.println(Thread.currentThread().getName() + " " + i);             if (i == 10) {                 new MyThread().start();                 new MyThread().start();              }         }     } }

      運行結果:

      ... main 48 main 49 Thread-0:0 Thread-0:1 Thread-0:2 Thread-0:3 Thread-0:4 Thread-1:0 ...

      從結果中可以看出:

      1、有三個線程:main、Thread-0 、Thread-1;

      2、Thread-0 、Thread-1兩個線程輸出的成員變量 i 的值不連續(xù)(這里的 i 是實例變量而不是局部變量)。因為:通過繼承Thread類實現多線程時,每個線程的創(chuàng)建都要創(chuàng)建不同的子類對象,導致Thread-0 、Thread-1兩個線程不能共享成員變量 i ;

      3、線程的執(zhí)行是搶占式,并沒有說Thread-0 或者Thread-1一直占用CPU(這也與線程優(yōu)先級有關,這里Thread-0 、Thread-1線程優(yōu)先級相同,關于線程優(yōu)先級的知識這里不做展開)

      (學習視頻推薦:java視頻教程)

      二、通過實現Runnable接口創(chuàng)建線程類

      定義一個類實現Runnable接口;創(chuàng)建該類的實例對象obj;將obj作為構造器參數傳入Thread類實例對象,這個對象才是真正的線程對象。

      public class MyRunnable implements Runnable {     @Override     public void run() {         for (int i = 0 ;i < 50 ;i++) {             System.out.println(Thread.currentThread().getName()+":" +i);         }     }      public static void main(String[] args) {        for (int i = 0;i < 50;i++) {             System.out.println(Thread.currentThread().getName() + ":" +i);             if (i == 10) {                 MyRunnable myRunnable = new MyRunnable();                 new Thread(myRunnable).start();                 new Thread(myRunnable).start();             }         }         //java8 labdam方式          new Thread(() -> {             System.out.println(Thread.currentThread().getName());         },"線程3").start();     } }

      運行結果:

      ... main:46 main:47 main:48 main:49 Thread-0:28 Thread-0:29 Thread-0:30 Thread-1:30 ...

      1、線程1和線程2輸出的成員變量i是連續(xù)的,也就是說通過這種方式創(chuàng)建線程,可以使多線程共享線程類的實例變量,因為這里的多個線程都使用了同一個target實例變量。但是,當你使用上述的代碼運行的時候,你會發(fā)現,其實結果有些并不連續(xù),這是因為多個線程訪問同一資源時,如果資源沒有加鎖,那么會出現線程安全問題;

      2、java8 可以使用lambda方式創(chuàng)建多線程。

      三、通過Callable和Future接口創(chuàng)建線程

      創(chuàng)建Callable接口實現類,并實現call()方法,該方法將作為線程執(zhí)行體,且該方法有返回值,再創(chuàng)建Callable實現類的實例;使用FutureTask類來包裝Callable對象,該FutureTask對象封裝了該Callable對象的call()方法的返回值;使用FutureTask對象作為Thread對象的target創(chuàng)建并啟動新線程;調用FutureTask對象的get()方法來獲得子線程執(zhí)行結束后的返回值。

      public class MyCallable implements Callable<Integer> {     private int i = 0;     @Override     public Integer call() throws Exception {         int sum = 0;         for (; i < 100; i++) {             System.out.println(Thread.currentThread().getName() + " " + i);             sum += i;         }         return sum;     }      public static void main(String[] args) throws ExecutionException, InterruptedException {         // 創(chuàng)建MyCallable對象         Callable<Integer> myCallable = new MyCallable();         //使用FutureTask來包裝MyCallable對象         FutureTask<Integer> ft = new FutureTask<Integer>(myCallable);         for (int i = 0;i<50;i++) {             System.out.println(Thread.currentThread().getName() + ":" + i);             if (i == 30) {                 Thread thread = new Thread(ft);                 thread.start();             }         }         System.out.println("主線程for循環(huán)執(zhí)行完畢..");         Integer integer = ft.get();         System.out.println("sum = "+ integer);     } }

      call()方法的返回值類型與創(chuàng)建FutureTask對象時<>里的類型一致。

      相關教程推薦:java快速入門

      贊(0)
      分享到: 更多 (0)
      ?
      網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號