java开启新线程

转载。出处:https://blog.csdn.net/ghsau/article/details/7443324

怎样在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();
            }
        }
    }
}
}

猜你喜欢

转载自blog.csdn.net/xupengbo527/article/details/80134798