1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      Java多線程的種類和區(qū)別

      本篇內(nèi)容主要講解“Java多線程的種類和區(qū)別”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Java多線程的種類和區(qū)別”吧!

      創(chuàng)新互聯(lián)自2013年創(chuàng)立以來,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站建設(shè)、做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元同心做網(wǎng)站,已為上家服務(wù),為同心各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:18980820575

      1.多線程種類和區(qū)別

      Thread類、runnable接口、callable接口,使用callable時(shí),需要重寫call方法,使用FutureTask調(diào)用,使用get方法可以獲取返回值。 Callable與Thread、Runnable最大的不同是Callable能返回一個(gè)異步處理的結(jié)果Future對(duì)象并能拋出異常,而其他兩種不能 runnable方式實(shí)現(xiàn)更為靈活,耦合度低,是比較常用的方式。面向接口編程也是設(shè)計(jì)模式六大原則的核心

      package thread;
      
      import java.util.concurrent.Callable;
      import java.util.concurrent.ExecutionException;
      import java.util.concurrent.FutureTask;
      
      public class CallableModel implements Callable {
      
          @SuppressWarnings("unchecked")
          @Override
          public V call() throws Exception {
              // TODO Auto-generated method stub
              System.out.println("重寫call方法");
              return (V) "調(diào)用callable,有返回值";
          }
      
          public static void main(String[] args) throws InterruptedException, ExecutionException {
              FutureTask futureTask = new FutureTask<>(
                      new CallableModel());
              Thread thread = new Thread(futureTask);
              thread.start();
              System.out.println(futureTask.get());
          }
      }

      2.多線程的好處

      發(fā)揮多核CPU的優(yōu)勢(shì),放置阻塞,方便建模等

      3.start和run的區(qū)別只有調(diào)用start才會(huì)表現(xiàn)出多線程特點(diǎn)。run只是一個(gè)普通方法,調(diào)用時(shí)多個(gè)線程會(huì)同步執(zhí)行。

      3.start和run的區(qū)別只有調(diào)用start才會(huì)表現(xiàn)出多線程特點(diǎn)。run只是一個(gè)普通方法,調(diào)用時(shí)多個(gè)線程會(huì)同步執(zhí)行。

      4.runnable和callable的區(qū)別callable可以和Future、FutureTask配合可以用來獲取異步執(zhí)行的結(jié)果,call方法是有返回值的,多線程充滿未知性,使用futureTask來獲取執(zhí)行結(jié)果,在等待太長時(shí)間未返回結(jié)果時(shí)取消此線程是非常有必要的

      5.CyclicBarrier和CountDownLatch的區(qū)別-柵欄鎖都在java.util.concurrent下,都可以用來表示代碼運(yùn)行到某個(gè)點(diǎn)上,CyclicBarrier用于等待一組事件完成,然后啟動(dòng)下一個(gè)事件,例如一組運(yùn)動(dòng)員準(zhǔn)備好之后,發(fā)出跑的命令,CountDownLatch允許一個(gè)或者多個(gè)線程等待一組事件的產(chǎn)生。 1)CyclicBarrier的某個(gè)線程運(yùn)行到某個(gè)點(diǎn)上之后,該線程即停止運(yùn)行,直到所有的線程都到達(dá)了這個(gè)點(diǎn),所有線程才重新運(yùn)行;CountDownLatch則不是,某線程運(yùn)行到某個(gè)點(diǎn)上之后,只是給某個(gè)數(shù)值-1而已,該線程繼續(xù)運(yùn)行。

      2)CyclicBarrier只能喚起一個(gè)任務(wù),CountDownLatch可以喚起多個(gè)任務(wù)。

      3)CyclicBarrier可重用(通過調(diào)用reset方法),CountDownLatch不可重用,計(jì)數(shù)值為0該CountDownLatch就不可再用了。 6.CyclicBarrier代碼示例

      package thread;
      
      ;
      
      /**
       *     
       * 項(xiàng)目名稱:test  
       * 類名稱:ThreadModel   
       * 類描述:  通過集成Thread實(shí)現(xiàn)多線程
       * 創(chuàng)建人:@author 王豐生
       * 創(chuàng)建時(shí)間:2019年7月1日 下午1:00:46 
       * 修改人:@author 王豐生
       * 修改時(shí)間:2019年7月1日 下午1:00:46   
       * 修改備注:
       * @version     
       *
       */
      public class ThreadModel extends Thread {
          private java.util.concurrent.CyclicBarrier cyclicBarrier;
      
          /**
           * Thread實(shí)際是實(shí)現(xiàn)了runnable接口的一個(gè)類,需要重寫run方法,調(diào)用start方法啟動(dòng)
           */
          public ThreadModel(java.util.concurrent.CyclicBarrier cyclicBarrier) {
              // TODO Auto-generated constructor stub
              this.cyclicBarrier = cyclicBarrier;
          }
      
          @Override
          public void run() {
              // TODO Auto-generated method stub
              super.run();
              try {
                  System.out.println(Thread.currentThread().getName() + "開始等待");
                  cyclicBarrier.await();
                  System.out.println(Thread.currentThread().getName() + "開始執(zhí)行");
                  Thread.sleep(1000 * 2);
                  System.err.println(Thread.currentThread().getName() + "執(zhí)行完畢");
              } catch (Exception e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
      
          }
      
          public static void main(String[] args) {
              int threadCount = 3;
              java.util.concurrent.CyclicBarrier cyclicBarrier = new java.util.concurrent.CyclicBarrier(
                      threadCount);
              for (int i = 0; i < threadCount; i++) {
                  System.out.println("創(chuàng)建工作線程" + i);
                  ThreadModel threadModel = new ThreadModel(cyclicBarrier);
                  threadModel.start();
              }
          }
      }

      7.CountDownlatch代碼示例主線程內(nèi)啟動(dòng)兩個(gè)線程之后,調(diào)用await方法,線程1執(zhí)行完畢。調(diào)用countdown,線程2執(zhí)行完畢調(diào)用countdown,代表線程都執(zhí)行完,則釋放await的鎖,繼續(xù)向下執(zhí)行

      /**
       * 看大夫任務(wù)
       * Created by jiapeng on 2018/1/7.
       */
      public class SeeDoctorTask implements Runnable{
      
          private CountDownLatch countDownLatch;
      
          public SeeDoctorTask(CountDownLatch countDownLatch){
              this.countDownLatch = countDownLatch;
          }
      
          @Override
          public void run() {
              try {
                  Thread.sleep(3000);
                  System.out.println("看大夫成功,大夫給開了些藥單子");
              } catch (InterruptedException e) {
                  e.printStackTrace();
              } finally {
                  if(countDownLatch != null) {
                      countDownLatch.countDown();
                  }
              }
          }
      }
      
      /**
       * 排隊(duì)的任務(wù)
       * Created by jiapeng on 2018/1/7.
       */
      public class QueueTask implements Runnable{
      
          private CountDownLatch countDownLatch;
      
          public QueueTask(CountDownLatch countDownLatch){
              this.countDownLatch = countDownLatch;
          }
      
          @Override
          public void run() {
              try {
                  Thread.sleep(5000);
                  System.out.println("排隊(duì)成功,可以開始交費(fèi)");
              } catch (InterruptedException e) {
                  e.printStackTrace();
              } finally {
                  if(countDownLatch != null) {
                      countDownLatch.countDown();
                  }
              }
          }
      }
      
      /**
       * 配媳婦去看病,輪到媳婦看大夫時(shí)
       * 我就開始去排隊(duì)準(zhǔn)備交錢了。
       * Created by jiapeng on 2018/1/7.
       */
      public class MainClient {
          public static void main(String[] args) throws Exception{
              long now = System.currentTimeMillis();
              CountDownLatch countDownLatch = new CountDownLatch(2);
              Executor executor = Executors.newFixedThreadPool(2);
              executor.execute(new SeeDoctorTask(countDownLatch));
              executor.execute(new QueueTask(countDownLatch));
              countDownLatch.await();
              System.out.println("over,回家 cost:"+(System.currentTimeMillis()-now));
          }
      }

      8.volatile關(guān)鍵字volatile修飾的變量保證了其在多線程之內(nèi)的可見性,相當(dāng)于一個(gè)輕量級(jí)的sychronized,多線程讀到的此變量一定都是最新的。

      9.什么是線程安全多線程狀態(tài)下獲得和單線程下永遠(yuǎn)能獲得同樣的結(jié)果,則代表是線程安全的,分為

      10.獲取線程堆棧dump文件死循環(huán)、死鎖、阻塞等問題,需要打印線程堆棧,可以使用getStackTrace()方法,使用jps獲取線程pid,用jstack pid命令,或者kill-3 pid來獲取線程堆棧信息

      11.線程出現(xiàn)了異常如果出現(xiàn)異常且未被捕獲,則線程會(huì)終止,如果這個(gè)線程持有某個(gè)某個(gè)對(duì)象的監(jiān)視器,那么這個(gè)對(duì)象監(jiān)視器會(huì)被立即釋放

      到此,相信大家對(duì)“Java多線程的種類和區(qū)別”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!


      分享名稱:Java多線程的種類和區(qū)別
      網(wǎng)頁URL:http://www.ef60e0e.cn/article/iheihe.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        民权县| 丘北县| 峨边| 祥云县| 克拉玛依市| 金阳县| 巨鹿县| 筠连县| 营山县| 七台河市| 永寿县| 苗栗县| 海淀区| 福鼎市| 花垣县| 都昌县| 邵武市| 巩留县| 普陀区| 孟村| 乳源| 合山市| 弥渡县| 息烽县| 南阳市| 洱源县| 阿拉善左旗| 石家庄市| 乌兰察布市| 涪陵区| 靖江市| 砀山县| 北川| 九龙坡区| 耿马| 荣成市| 阳山县| 昌乐县| 玉树县| 象州县| 黎平县|