java 应用程序中线程池的创建方式—基于jdk

  • Post author:
  • Post category:java


线程 的使用我们常常用来提高服务的处理效率 或者让服务器异步处理增加交互的快速响应

下面主要介绍几种基于jdk 的原生的线程池

第一种 基于工具类 Executors 的创建  该工具类的创建有好多种请查看 Executors的静态方法 和jdk的 api 说明 下面只是一个简单的举例

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

public class TestThead {
    private static ExecutorService executor = Executors.newFixedThreadPool(3);
    //Executors.newCachedThreadPool();     
    public static void main(String[] args) throws Exception{
        executor.execute(new TestRuanble("runable"));
        Future<String> callResult= executor.submit(new TestCallbale("callable"));
        System.out.println(callResult.get());
    }
}

class TestRuanble implements Runnable {
    private String id;

    public TestRuanble(String id) {
        this.id = id;
    }
    @Override
    public void run() {
        System.out.println(id);
    }
}
class TestCallbale implements Callable<String> {
    private String id;
    public TestCallbale(String id) {
        this.id = id;
    }
    @Override
    public String call() throws Exception {
        return id;
    }
}


第二种 直接创建 ThreadPoolExecutor 线程池对象 根据构造函数去创建 ,里面的 参数不在详细的讲解 这里简单介绍下里面的200毫秒的时间。当空闲线程数量大于核心线程的数量时候。在等待200 毫秒以后线程池会吧多余的空闲的线程关闭掉。维护好核心线程的数量。减小开销。ThreadPoolExecutor 的构造函数请参考jdk 代码和 jdk api

package com.test.demo;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Future;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.google.common.collect.Lists;
public class TestThead { 
    private static ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS,
            new ArrayBlockingQueue<Runnable>(5));
    public static void main(String[] args) {
        List<Future<String>> data=Lists.newArrayList();
        for (int i = 0; i < 15; i++) {
            MyTask myTask = new MyTask(i);
            executor.execute(myTask);
           // data.add(executor.submit(task)) task 需要 实现 Callable 接口 返回数据
            System.out.println("线程池中线程数目:" + executor.getPoolSize() + ",队列中等待执行的任务数目:" + executor.getQueue().size()
                    + ",已执行玩别的任务数目:" + executor.getCompletedTaskCount());
        }
        executor.shutdown();
    }
}
class MyTask implements Runnable {
    private int taskNum;
    public MyTask(int num) {
        this.taskNum = num;
    }
    @Override
    public void run() {
        System.out.println("正在执行task " + taskNum);
        try {
            Thread.currentThread().sleep(4000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("task " + taskNum + "执行完毕");
    }
}

线程池的创建使用 这里介绍过了 就不在介绍 线程的创建的使用了。线程池可以使用同步线程和异步线程两种。使用时请根据需要去使用响应的方法。



版权声明:本文为buzaiguihun原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。