线程池

Posted qq1312583369

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线程池相关的知识,希望对你有一定的参考价值。

概念:

线程池,其实就是一个容纳多个线程的容器,其中的线程可以反复使用,省去了频繁创建线程对象的操作,无需反复创建线程而消耗过多资源。

技术分享图片

使用线程池方式--Runnable接口

通常,线程池都是通过线程池工厂创建,再调用线程池中的方法获取线程,再通过线程去执行任务方法。

步骤:

1、Executors:线程池创建工厂类

  public static ExecutorService newFixedThreadPool(int nThreads):返回线程池对象

2、ExecutorService:线程池类

  Future<?> submit(Runnable task):获取线程池中的某一个线程对象,并执行

3、Future接口:用来记录线程任务执行完毕后产生的结果。线程池创建与使用

 

  使用线程池中线程对象的步骤:

  ①创建线程池对象

  ②创建Runnable接口子类对象

  ③提交Runnable接口子类对象

  ④关闭线程池

演示:

 
public class demo1 implements Runnable{

    public void run() {
        for(int i=0;i<100;i++){
            System.out.println("run....."+i);
        }
    }
    
}
 
 
public class xianchengchi {
    public static void main(String[] args) {
        //获取线程池对象(从线程池工厂获得)
        ExecutorService es=Executors.newFixedThreadPool(2);
        //创建Runnable接口子类对象(创建任务对象)
        demo1 run=new demo1();
        //提交Runnable接口子类对象(线程池选一条线程执行你提交过来的任务)
        es.submit(run);
        for(int i=0;i<100;i++){
            System.out.println("main....."+i);
        }
        //关闭线程池
        es.shutdown();
    }
}
 

使用线程池方式-Callable接口 

Callable接口:

与Runnable接口功能相似,用来指定线程的任务。其中的call()方法,用来返回线程任务执行完毕后的结果,call方法可抛出异常。

步骤:

1、ExecutorService:线程池类

2、<T> Future<T> submit(Callable<T> task):获取线程池中的某一个线程对象,并执行线程中的call()方法

3、Future接口:用来记录线程任务执行完毕后产生的结果。线程池创建与使用

 

  使用线程池中线程对象的步骤:

  ①创建线程池对象

  ②创建Callable接口子类对象

  ③提交Callable接口子类对象

  ④关闭线程池

 
//Callable泛型就是你call()的返回值类型
public class MyCallable implements Callable<String>{

    public String call(){
        return "这是Call方法";
    }
}
 
public static void main(String[] args) throws InterruptedException, ExecutionException {
    //获取线程池
    ExecutorService es=Executors.newFixedThreadPool(2);
    //创建Callable子类
    MyCallable mc=new MyCallable();
    //提交callable子类
    Future<String> f=es.submit(mc);
    String str=f.get();//获取Future对象的内容用get()
    System.out.println(str);
    es.shutdown();
}

练习:

1、异步计算0—100和&0—200的和

 
public class jisuan implements Callable<Integer>{
    private Integer a;
    jisuan(Integer a){
        this.a=a;
    }
    public Integer call() throws Exception {
        int sum=0;
        for(int i=0;i<=a;i++){
            sum+=i;
        }
        return sum;
    }
}
 
//异步计算0——100和&0-200的和
    public static void main(String[] args) throws InterruptedException, ExecutionException {
    //获取线程池
    ExecutorService es=Executors.newFixedThreadPool(2);
    //创建Callable子类
    jisuan js=new jisuan(100);
    jisuan js2=new jisuan(200);
    //提交callable子类
    Future<Integer> f=es.submit(js);
    Future<Integer> f2=es.submit(js2);
    //从Future中获取返回值
    System.out.println(f.get());
    System.out.println(f2.get());
    //关闭线程池
    es.shutdown();
}
 

2、返回两个数相加的结果

 
public class qiuhe implements Callable<Integer>{
    private int a;
    private int b;
    public qiuhe(int a, int b) {
        super();
        this.a = a;
        this.b = b;
    }
    public Integer call() throws Exception {
        int sum=0;
        sum=a+b;
        return sum;
    }
}
 
public class demo4 {
    public static void main(String[] args) throws InterruptedException, ExecutionException {
        ExecutorService es=Executors.newFixedThreadPool(2);
        qiuhe qh1=new qiuhe(100,50);
        qiuhe qh2=new qiuhe(200,50);
        Future<Integer> f1=es.submit(qh1);
        Future<Integer> f2=es.submit(qh2);
        System.out.println(f1.get());
        System.out.println(f2.get());
        es.shutdown();
    }
}

以上是关于线程池的主要内容,如果未能解决你的问题,请参考以下文章

Java——线程池

Motan在服务provider端用于处理request的线程池

Java线程池详解

Java线程池详解

Java 线程池详解

线程池-实现一个取消选项