1. 程式人生 > >java開啟新執行緒

java開啟新執行緒

怎樣在java執行的過程中開啟一個執行緒池去執行多工?
1. 建立一個執行緒池的方法:
第一種:

ExecutorService executorService = Executors.newFixedThreadPool(3);  //該方法是規定了執行緒池裡面執行緒的數量

第二種:

ExecutorService threadPool = Executors.newCachedThreadPool();// 執行緒池的大小會根據執行的任務數動態分配  

第三種 :

ExecutorService executorService = Executors.newSingleThreadExecutor();//建立含有一個執行緒的執行緒池
  1. 啟動執行緒的方法;
    a:

    public static void main(String[] args) {
          ExecutorService executorService = Executors.newFixedThreadPool(3);
    for(int i = 1 ; i < 5 ; i++){
    executorService.execute(new Runnable() {  // 該種方式沒有返回值
        @Override
        public void run() {
            System.out.println("內部執行緒" + Thread.currentThread().getName());
        }
    });
    }
    System.out.println("最外部的執行緒:" + Thread.currentThread().getName());
    

    }

b:

public static void main(String[] args) {
    ExecutorService executorService =
            Executors.newFixedThreadPool(3);
    for(int i = 1; i < 5; i++){
        try {
        Future<String> submit = executorService.submit(new Callable<String>() {  //這種方式帶有返回值
            @Override
            public String call() throws Exception {
                return "執行緒的名字是" + Thread.currentThread().getName();
            }
        });
            System.out.println((String)submit.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
    }
}

注:在實際的應用中,可以將執行緒查出來的結果放到map中。封裝完成後再從map中取值。
例如:

package threadpackage;

import java.util.HashMap;
import java.util.concurrent.*;

public class threadController {
public static void main(String[] args) {
    ExecutorService executorService = Executors.newCachedThreadPool();
    //建立map用於儲存任務返回的內容
    HashMap<String, Future> futureMap = new HashMap<>();
    //Id.舉例
    Long id = null;
    //第一個任務
    futureMap.put("student", executorService.submit(new Callable<Student>() {
        @Override
        public Student call() throws Exception {
            return studentService.queryStudentById(id);
        }
    }));
    //第二個任務
    futureMap.put("commodity", executorService.submit(new Callable<Commodity>() {
        @Override
        public Commodity call() throws Exception {
            return commodityService.queryCommodityById(id);
        }
    }));

    //檢查執行緒返回
    if (null != futureMap) {
        for (String s : futureMap.keySet()) {
            try {
                if (s.equals("student")) {
                    Student student = (Student) futureMap.get(s).get();//獲取執行緒返回的Student資訊
                } else if (s.equals("commodity")) {
                    Commodity commodity = (Commodity) futureMap.get(s).get();//獲取執行緒返回的Commodity的資訊.使用get會產生執行緒阻塞的可能,一般會使用get(1000,TimeUnit.MILLISECONDS).超過規定時間就返回為空。
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
    }
}
}