<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      TryCatch~

      Java多線程

      Java多線程

      Java實現多線程有四種方式:

      1.繼承Thread類;

      2.實現Runable接口;

      3.實現Callable接口,通過FutureTask包裝器來創建Thread線程;

      4.使用ExecutorService、Callable、Future實現有返回結果的多線程;

      其中前兩種線程執行完是沒有返回結果的,后兩種是有返回值的。

       

      先貼出一個多線程售票的簡單示例,根據代碼去理解多線程:

      /**
       * 一個售票類,實現Runnable接口重寫run()方法來實現線程
       */
      @Data
      public class SellTicket implements Runnable{
          //票總數
          private int tickets;
      
          SellTicket(int tickets){
              this.tickets = tickets;
          }
      
          @Override
          public void run() {
              while(true) {
                  //鎖,如果這里不加鎖的話,當多個線程同時進入tickets > 0時,可能會出現最后余票為-1,-2的情況
                  synchronized (this){
                      if(tickets > 0) {
                          try {
                              Thread.sleep(100);
                          } catch(Exception e) {
                              e.printStackTrace();
                          }
                          System.out.println(Thread.currentThread().getName() + "賣掉一張票,剩下: " + --tickets +"張");
                      }else{
                          break;
                      }
                  }
              }
          }
      }
      /**
       * 測試類
       */
      public class Test {
          public static void main(String[] args) {
              SellTicket p1 = new SellTicket(20);
              Thread t1 = new Thread(p1,"線程1");
              Thread t2 = new Thread(p1,"線程2");
              Thread t3 = new Thread(p1,"線程3");
              //setPriority(),參數為1-10,參數越大,優先級越高,參數超過10會報錯
              //t1.setPriority(1);
              //t2.setPriority(2);
              //t3.setPriority(10);
              t1.start();
              t2.start();
              t3.start();
          }
      }

      運行結果:

        在測試類中,如果將注釋的優先級放開,那執行結果都會是線程3在售票,當票數更多時,線程1和線程2也會開始售票。當有優先調度需求時,setPriority()就能派上用場。

      總結:

      1. 前兩種創建多線程的方式差不多,只是因為Java只支持單繼承但可以實現多個接口,所以繼承Thread類來實現接口會有一定的局限性。

      2.Thread類本質上是實現了Runnable接口的一個實例,代表一個線程的實例。啟動線程的唯一方法就是通過Thread類的start()實例方法。start()方法是一個native方法,它將啟動一個新線程,并執行run()方法。這種方式實現多線程很簡單,通過自己的類直接extend Thread,并復寫run()方法,就可以啟動新線程并執行自己定義的run()方法。

      修改售票示例,通過實現Callable接口實現多線程,并知道線程2賣了多少張票:

      /**
       * 一個售票類,實現Callable接口重寫call()方法來實現線程
       */
      @Data
      public class SellTickets implements Callable<Integer> {
          //票總數
          private int tickets;
      
          SellTickets(int tickets){
              this.tickets = tickets;
          }
      
          @Override
          public Integer call() {
              int thread2 = 0;
              while(true) {
                  //鎖,如果這里不加鎖的話,當多個線程同時進入tickets > 0時,可能會出現最后余票為-1,-2的情況
                  synchronized (this){
                      if(tickets > 0) {
                          try {
                              Thread.sleep(100);
                          } catch(Exception e) {
                              e.printStackTrace();
                          }
                          System.out.println(Thread.currentThread().getName() + "賣掉一張票,剩下: " + --tickets +"張");
                          if("Thread-1".equals(Thread.currentThread().getName())){
                              thread2++;
                          }
                      }else{
                          break;
                      }
                  }
              }
              return thread2;
          }
      }
      /**
       * 測試類
       */
      public class Test {
          public static void main(String[] args) {
      
              Callable<Integer> callable = new SellTickets(100);
      
              FutureTask<Integer> futureTask = new FutureTask<>(callable);
              Thread thread = new Thread(futureTask);
              thread.start();
      
              FutureTask<Integer> futureTask2 = new FutureTask<>(callable);
              Thread thread2 = new Thread(futureTask2);
              thread2.start();
      
              //獲取線程2的返回值
              Integer sum = 0;
              try{
                  sum = futureTask2.get();
              }catch (Exception e){
                  e.printStackTrace();
              }
              System.out.println("線程2售票:"+sum+"張");
      
          }
      }

        具體是創建Callable接口的實現類,并實現call()方法。并使用FutureTask類來包裝Callable實現類的對象,且以此FutureTask對象作為Thread對象的target來創建線程。首先,我們發現,在實現Callable接口中,此時不再是run()方法了,而是call()方法,此call()方法作為線程執行體,同時還具有返回值!

        

      posted on 2019-12-06 10:58  TryCatch~  閱讀(420)  評論(0)    收藏  舉報

      導航

      主站蜘蛛池模板: 女高中生强奷系列在线播放| 国产浮力第一页草草影院| 欧美色欧美亚洲高清在线视频| 99久久精品一区二区国产| 久久国产自偷自偷免费一区| A级毛片无码久久精品免费| 国产一区在线播放av| 亚洲综合av一区二区三区 | 伊人热热久久原色播放WWW| 中文字幕色av一区二区三区 | 日本一道一区二区视频| 欧美成人片在线观看| 精品精品亚洲高清a毛片| 亚洲爽爆av一区二区| 啦啦啦高清在线观看视频www| 2021国产成人精品久久| 狼色精品人妻在线视频| 久久精品国产亚洲av天海翼| 亚洲国产精品人人做人人爱| 无码中文av波多野结衣一区| 国产精品一区二区三区激情 | 昌江| 中国xxx农村性视频| 亚洲AV成人片不卡无码| 日本五十路熟女一区二区| 四虎精品视频永久免费| 精品乱码一区二区三四区视频| 四虎女优在线视频免费看| 99精品国产综合久久久久五月天| 亚洲天堂av在线免费看| 午夜一区二区三区视频| 成人无码一区二区三区网站| 色猫咪av在线网址| 少妇高潮太爽了在线视频| 人妻丝袜无码专区视频网站| 亚洲鸥美日韩精品久久| 中文字幕一区二区网站| 中文字幕国产精品综合| 国产蜜臀在线一区二区三区| 国产精品点击进入在线影院高清 | 亚洲一区二区三区18禁|