Java线程池介绍

  什么是线程池?线程池提供了一个线程队列,队列中保存着所有等待状态的线程。避免了创建与销毁额外开销,提高了响应的速度。作用类似于数据库连接池。
  
  Java中线程池的体系结构如下:
java.util.concurrent.Executor : 负责线程的使用与调度的根接口
 |–ExecutorService Executor的子接口: 线程池的主要接口
   |–ThreadPoolExecutor ExecutorService的实现类
   |–ScheduledExecutorService ExecutorService的子接口:负责线程的调度
     |–ScheduledThreadPoolExecutor :既继承了ThreadPoolExecutor,同时实现了ScheduledExecutorService

  在实际使用过程中,我们不需要自己手动new出线程池,juc的工具类Executors为我们提供了方法用以创建线程池:
  ExecutorService newFixedThreadPool() : 创建固定大小的线程池
  ExecutorService newCachedThreadPool() : 缓存线程池,线程池的数量不固定,可以根据需求自动的更改数量。
  ExecutorService newSingleThreadExecutor() : 创建单个线程池。线程池中只有一个线程
  
  ScheduledExecutorService newScheduledThreadPool() : 创建固定大小的线程池,可以延迟或定时的执行任务。

  下面演示使用Executors.newFixedThreadPool()方法创建线程池:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class TestThreadPool {

    public static void main(String[] args) throws Exception {
        // 1. 创建线程池
        ExecutorService pool = Executors.newFixedThreadPool(5);

        ThreadPoolDemo tpd = new ThreadPoolDemo();

        // 2. 为线程池中的线程分配任务
        for (int i = 0; i < 10; i++) {
            pool.submit(tpd);
        }

        // 3. 关闭线程池
        pool.shutdown();
    }

}

class ThreadPoolDemo implements Runnable {

    private int i = 0;

    @Override
    public void run() {
        while (i <= 100) {
            System.out.println(Thread.currentThread().getName() + " : " + i++);
        }
    }
}

  程序运行结果:
  
  image_1b8kcr492cau9bo1tp4mhkfimm.png-86.6kB
  
  除了像上面这段代码中一样使用runnable为线程池中的线程分配任务外,还可以使用callable:


import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class TestThreadPool {

    public static void main(String[] args) throws Exception {
        //1. 创建线程池
        ExecutorService pool = Executors.newFixedThreadPool(5);

        List<Future<Integer>> list = new ArrayList<>();

        for (int i = 0; i < 10; i++) {
            Future<Integer> future = pool.submit(new Callable<Integer>(){

                @Override
                public Integer call() throws Exception {
                    int sum = 0;

                    for (int i = 0; i <= 100; i++) {
                        sum += i;
                    }
                    return sum;
                }
            });
            list.add(future);
        }
        pool.shutdown();

        for (Future<Integer> future : list) {
            System.out.println(future.get());
        }
    }
}

  程序运行结果:
  
  image_1b8kcpq5n1ravtlf6k010t7goc9.png-25.1kB
  
  最后总结一下创建线程的四种方式:
1. 继承Thread
2. 实现runnable
3. 实现callable
4. 使用线程池

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值