1. 程式人生 > 程式設計 >Java ExecutorServic執行緒池非同步實現流程

Java ExecutorServic執行緒池非同步實現流程

相信大家都在專案中遇到過這樣的情況,前臺需要快速的顯示,後臺還需要做一個很大的邏輯。比如:前臺點選資料匯入按鈕,按鈕後的服務端執行邏輯A,和邏輯B(執行大量的表資料之間的copy功能),而這時前臺不能一直等著,要返回給前臺,告訴正在處理中就行了。這裡就需要用到非同步了。

點選按鈕 -> 邏輯A ->邏輯B(非同步) -> 方法結束。

到底,專案需求明確了,就引入了ExecutorServic執行緒池。

Java通過Executors提供四種執行緒池,分別為:

  • newCachedThreadPool建立一個可快取執行緒池,如果執行緒池長度超過處理需要,可靈活回收空閒執行緒,若無可回收,則新建執行緒。
  • newFixedThreadPool 建立一個定長執行緒池,可控制執行緒最大併發數,超出的執行緒會在佇列中等待。
  • newScheduledThreadPool 建立一個定長執行緒池,支援定時及週期性任務執行。
  • newSingleThreadExecutor 建立一個單執行緒化的執行緒池,它只會用唯一的工作執行緒來執行任務,保證所有任務按照指定順序(FIFO,LIFO,優先順序)執行。
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * @author szy 
 * @version 建立時間:2018-5-20 上午10:25:06
 * 
 */
public class Testasync {

  /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    if(task0() == true){
      System.out.println("執行完畢,看非同步結果");
    }
    
  }

  
  public static void task1(){
    System.out.println("task1 is start");
  }
  
  public static void task2(){
     ExecutorService executor = Executors.newFixedThreadPool(1);
     executor.submit(new Callable(){

      @Override
      public Object call() throws Exception {
        // TODO Auto-generated method stub
        
        //增加睡眠時間,便於檢視結果
        /* try {
            Thread.sleep(10000);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }*/
         
        //非同步提交
        int sum = 0;
        for (int i = 0; i < 10000; i++) {
           sum += i;
        }
        System.out.println("task2執行資料的大量匯入或者匯出");
        System.out.println("task2="+sum);
        System.out.println("task2匯入或者匯出完成");
        return null;
      }
       
       
     });
    
  }
  
  public static void task3(){
    System.out.println("task3 is start");
    int j = 0;
    while(true) {
      if(j++ > 10) {
        break;
      }
      System.out.println("------------task3 end-----------");
    }
  }
  
  public static boolean task0(){
    task1();
    task2();
    task3();
    return true;
  }
}

然後看結果:

task1 is start
task3 is start
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
------------task3 end-----------
task2執行資料的大量匯入或者匯出
執行完畢,看非同步結果
task2=49995000
task2匯入或者匯出完成

可以看出,task1 和task3先執行了,並且方法在沒有等待task2的情況下,直接結束了。

非同步的task2另開了一個執行緒,自己在執行。和主執行緒已經無關了。

不過,這種在eclipse中以deubug模式是看不出來的。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。