转载。出处:https://blog.csdn.net/ghsau/article/details/7443324
怎样在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();
}
}
}
}
}