线程池 主要用来解决线程生命周期开销问题和资源不足问题

线程池 容纳多个线程的容器,线程池中的线程可以被反复使用,从而避免频繁创建线程对象的操作,减少系统资源的消耗

 

/*
* JDK1.5新特性,实现线程池程序
* 使用工厂类 Executors中的静态方法创建线程对象,指定线程的个数
* static ExecutorService newFixedThreadPool(int 个数) 返回线程池对象
* 该对象 实质是 ExecutorService接口的实现类对象,此对象可调用方法submit()   用以提交线程执行任务
*/

 

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

1.创建线程池对象   ExecutorService threadPool = Executors.newFixedThreadPool(2)  //工厂类 Executors的 静态方法

2.创建 Runnable 或 Callable 接口的实现类对象  MyRunnable r = new MyRunnable()

3.线程池对象以submit()方法 提交 Runnable 或 Callable 接口的子类对象  ,则池中线程 自动调用 子类对象中的 run()方法  或 call()方法  

         submit(Runnable task)  // run()方法 无返回值   不能抛异常   

<T> Future<T> submit(Callable<T> task)  // Future接口:用来记录线程任务执行完毕后产生的结果   call()方法 有返回值 可以抛异常

4.关闭线程池  service.shutdown() 

注意:submit方法调用结束后,程序并不终止,是因为线程池控制了线程的关闭。将使用完的线程又归还到了线程池中

Callable接口

 

public class ThreadPoolRunnable implements Runnable {
    public void run(){
        System.out.println(Thread.currentThread().getName()+" 线程提交任务");
    }
}
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolDemo {
    public static void main(String[] args) {
        //调用工厂类的静态方法,创建线程池对象
        //返回线程池对象,是返回的接口
        ExecutorService es = Executors.newFixedThreadPool(2);
        //调用接口实现类对象es中的方法submit提交线程任务
        //将Runnable接口实现类对象,传递
        es.submit(new ThreadPoolRunnable());
        es.submit(new ThreadPoolRunnable());

    
    }
}

 

import java.util.concurrent.Callable;

public class ThreadPoolCallable implements Callable<String>{
    public String call(){
        return "abc";
    }
}
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;


public class ThreadPoolDemo1 {
    public static void main(String[] args)throws Exception {
        ExecutorService es = Executors.newFixedThreadPool(2);
        //提交线程任务的方法submit方法返回 Future接口的实现类
        Future<String> f = es.submit(new ThreadPoolCallable());
        String s = f.get();
        System.out.println(s);
    }
}

 

 

 多线程的两个求和计算的异步

import java.util.concurrent.Callable;

public class GetSumCallable implements Callable<Integer>{
    private int a;
    public GetSumCallable(int a){
        this.a=a;
    }
    
    public Integer call(){
        int sum = 0 ;
        for(int i = 1 ; i <=a ; i++){
            sum = sum + i ;
        }
        return sum;
    }
}

 

/*
 * 使用多线程技术,求和
 * 两个线程,一个线程计算1~100的求和,另一个线程计算1~200的求和
 * 多线程的异步计算
 */
public class ThreadPoolDemo {
    public static void main(String[] args)throws Exception {
        ExecutorService es = Executors.newFixedThreadPool(2);
        Future<Integer> f1 =es.submit(new GetSumCallable(100));
        Future<Integer> f2 =es.submit(new GetSumCallable(200));
        System.out.println(f1.get());
        System.out.println(f2.get());
        es.shutdown();
    }
}