java開啟新執行緒
阿新 • • 發佈:2019-01-10
怎樣在java執行的過程中開啟一個執行緒池去執行多工?
1. 建立一個執行緒池的方法:
第一種:
ExecutorService executorService = Executors.newFixedThreadPool(3); //該方法是規定了執行緒池裡面執行緒的數量
第二種:
ExecutorService threadPool = Executors.newCachedThreadPool();// 執行緒池的大小會根據執行的任務數動態分配
第三種 :
ExecutorService executorService = Executors.newSingleThreadExecutor();//建立含有一個執行緒的執行緒池
啟動執行緒的方法;
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();
}
}
}
}
}