<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                [TOC] ## 1. 繼承Thread類 通過繼承Thread類來創建并啟動多線程的步驟如下: **1. 定義一個類繼承Thread類,并重寫Thread類的run()方法,run()方法的方法體就是線程要完成的任務,因此把run()稱為線程的執行體;** **2. 創建該類的實例對象,即創建了線程對象;** **3. 調用線程對象的start()方法來啟動線程;** ~~~ package com.tuna.javatest.thread; public class ExtendThread extends Thread { private int i; public void run() { for (; i < 10; i++) { //當通過繼承Thread類的方式實現多線程時,可以直接使用this獲取當前執行的線程 System.out.println(this.getName() + " " + i); } } public static void main(String[] args) { for (int j = 0; j < 5; j++) { //調用Thread類的currentThread()方法獲取當前線程 System.out.println(Thread.currentThread().getName() + " " + j); //創建并啟動第一個線程 new ExtendThread().start(); } } } ~~~ ## 2. 實現Runnable接口 這種方式創建并啟動多線程的步驟如下: **1. 定義一個類實現Runnable接口;** **2. 創建該類的實例對象obj;** **3. 將obj作為構造器參數傳入Thread類實例對象,這個對象才是真正的線程對象;** **4. 調用線程對象的start()方法啟動該線程;** 推薦這種寫法,體現設計與實現分離的思想 ~~~ package com.tuna.javatest.thread; public class ImpRunnable implements Runnable { private int i; @Override public void run() { for(;i < 5;i++) { //當線程類實現Runnable接口時,要獲取當前線程對象只有通過Thread.currentThread()獲取 System.out.println(Thread.currentThread().getName() + " " + i); } } public static void main(String[] args) { for(int j = 0;j < 30;j++) { System.out.println(Thread.currentThread().getName() + " " + j); ImpRunnable thread_target = new ImpRunnable(); new Thread(thread_target,j+"").start(); } } } ~~~ ## 3. Callable和Future接口創建線程 ### 3.1 Callable接口 通過實現Runnable接口創建多線程時,Thread類的作用就是把run()方法包裝成線程的執行體,那么,是否可以直接把任意方法都包裝成線程的執行體呢?從JAVA5開始,JAVA提供提供了Callable接口,該接口是Runnable接口的增強版,Callable接口提供了一個call()方法可以作為線程執行體,但call()方法比run()方法功能更強大,call()方法的功能的強大體現在: 1. call()方法可以有返回值; 2. call()方法可以聲明拋出異常; 從這里可以看出,完全可以提供一個Callable對象作為Thread的target,而該線程的線程執行體就是call()方法。但問題是:Callable接口是JAVA新增的接口,而且它不是Runnable接口的子接口,所以Callable對象不能直接作為Thread的target。還有一個原因就是:call()方法有返回值,call()方法不是直接調用,而是作為線程執行體被調用的,所以這里涉及獲取call()方法返回值的問題。 于是,JAVA5提供了Future接口來代表Callable接口里call()方法的返回值,并為Future接口提供了一個FutureTask實現類,該類實現了Future接口,并實現了Runnable接口,所以FutureTask可以作為Thread類的target,同時也解決了Callable對象不能作為Thread類的target這一問題。 ### 3.2 Future接口 是對于具體的Runnable或者Callable任務的執行結果進行**取消**、**查詢是否完成**、**獲取結果** 。必要時可以通過get方法獲取執行結果,該方法會阻塞直到任務返回結果。 接口中有5中方法: 1. **cancel(boolean mayInterruptIfRunning)** 方法用來取消任務,如果取消任務成功則返回true,如果取消任務失敗則返回false。 參數mayInterruptIfRunning表示是否允許取消正在執行卻沒有執行完畢的任務,如果設置true,則表示可以取消正在執行過程中的任務。如果任務已經完成,則無論mayInterruptIfRunning為true還是false,此方法肯定返回false,即如果取消已經完成的任務會返回false;如果任務正在執行,若mayInterruptIfRunning設置為true,則返回true,若mayInterruptIfRunning設置為false,則返回false;如果任務還沒有執行,則無論mayInterruptIfRunning為true還是false,肯定返回true。 2. **isCancelled()** 方法表示任務是否被取消成功,如果在任務正常完成前被取消成功,則返回 true。 3. **isDone()** 方法表示任務是否已經完成,若任務完成,則返回true; 4. **get()** 方法用來獲取執行結果,這個方法會產生阻塞,會一直等到任務執行完畢才返回; 5. **get(long timeout, TimeUnit unit)** 用來獲取執行結果,如果在指定時間內,還沒獲取到結果,就直接返回null。可用在任務超時控制的情形。 ### 3.3 線程實現 1. 實現Callable接口并重寫call方法,完成要執行的邏輯 ~~~ class Task implements Callable<Object> { private String args1; private String args2; //構造函數,用來向task中傳遞任務的參數 public Task(String args1,String args2) { this.args1=args1; this.args2=args2; } //任務執行的動作 @Override public Object call() throws Exception { for(int i=0;i<10;i++){ System.out.println("call執行任務!"); } return true; } } ~~~ 2. 創建FutureTask對象(傳入),將邏輯交給線程 ``` public static void main(String[] args) { Task myTask = new Task("11", "22");//實例化任務,傳遞參數 FutureTask<Object> futureTask = new FutureTask(myTask);//將任務放進FutureTask里 //采用thread來開啟多線程,futuretask繼承了Runnable,可以放在線程池中來啟動執行 Thread thread = new Thread(futureTask); thread.start(); try { //get():獲取任務執行結果,如果任務還沒完成則會阻塞等待直到任務執行完成。如果任務被取消則會拋出CancellationException異常, //如果任務執行過程發生異常則會拋出ExecutionException異常,如果阻塞等待過程中被中斷則會拋出InterruptedException異常。 boolean result = (boolean) futureTask.get(); System.out.println("result:" + result ); } catch (Exception e) { e.printStackTrace(); } } ``` 3. 完整代碼 ~~~ class Task implements Callable<Object> { private String args1; private String args2; //構造函數,用來向task中傳遞任務的參數 public Task(String args1,String args2) { this.args1=args1; this.args2=args2; } //任務執行的動作 @Override public Object call() throws Exception { for(int i=0;i<10;i++){ System.out.println("call執行任務!"); } return true; } public static void main(String[] args) { Task myTask = new Task("11", "22");//實例化任務,傳遞參數 FutureTask<Object> futureTask = new FutureTask(myTask);//將任務放進FutureTask里 //采用thread來開啟多線程,futuretask繼承了Runnable,可以放在線程池中來啟動執行 Thread thread = new Thread(futureTask); thread.start(); try { //get():獲取任務執行結果,如果任務還沒完成則會阻塞等待直到任務執行完成。如果任務被取消則會拋出CancellationException異常, //如果任務執行過程發生異常則會拋出ExecutionException異常,如果阻塞等待過程中被中斷則會拋出InterruptedException異常。 boolean result = (boolean) futureTask.get(); System.out.println("result:" + result ); } catch (Exception e) { e.printStackTrace(); } } } ~~~ ``` call執行任務! call執行任務! call執行任務! call執行任務! call執行任務! call執行任務! call執行任務! call執行任務! call執行任務! call執行任務! result:true ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看