美文网首页
多线程基础--线程池

多线程基础--线程池

作者: collincp | 来源:发表于2018-09-13 00:25 被阅读0次

正常项目中是不允许频繁创建线程。需要使用线程池来管理。jdk1.5后已经提供有管理线程池的API

代码实现:要求jdk版本1.5以上。当前版本为jdk 1.8

------------------------------------------代码实现-------------------------------------------

import java.util.Iterator;
import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

public class ThreadPool {
private static int threadPoolSize = 2;
public static void main(String[] args) {
// 创建 Runnable 线程 将任务简单化,可以用内部类。线程任务更直观
Thread threadRun = new Thread (new Runnable() {
@Override
public void run() {
doRunTask();
}
});
// 创建有返回的线程任务
FutureTask<String> futureTask = new FutureTask<>(new Callable<String>() {
@Override
public String call() throws Exception {
String quest = "Callable call task and print task";
doCallable(quest);
return doCallable(quest);
}
});

   //线程启动 可以看出 启动的方式都是Thread进行 

// threadRun.start();//Thread 开始方法不可取
// new Thread(threadRun).start();//创建 线程启动 方法不可取
// new Thread(futureTask).start();//创建 线程启动 方法不可取

    //线程池启动任务 可以查看任务名称来看启动多少个
    ExecutorService fixedThreadPool = Executors.newFixedThreadPool(threadPoolSize); 
    fixedThreadPool.execute(threadRun);//无返回
    fixedThreadPool.submit(futureTask);//有返回

    String callResultPoll = null;
    try {
        callResultPoll = (String) futureTask.get();//特别注意 该方法会阻塞,如果没有获取到值会一直等待

// boolean doneBoolean = futureTask.isDone();//可以改方法来判断是非执行完
System.out.println(callResultPoll);//打印结果
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}

    /********************线程池添加任务************************/
    ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<String>();
    queue.offer("intput a");//添加数量大于线程数
    queue.offer("intput b");
    queue.offer("intput  c");
    queue.offer("intput d");
    queue.add(" intput e");
  
    Iterator<String> iterator = queue.iterator();
    while (iterator.hasNext()) {
        String qStr = iterator.next();
        FutureTask<String> future = new FutureTask<String>(new Callable<String>() {
            @Override
            public String call() throws Exception {
                String quest = qStr;
                doCallable(quest);
                System.out.println(" threadName : " + Thread.currentThread().getName());
                //打印线程名称,可以看出while中将queue内容全部添加了,但是线程名称就两个
                return doCallable(quest);
            }
        });
        fixedThreadPool.submit(future);
        try {
            String callResult =future.get();
            System.out.println("callResult : " + callResult);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
        
    }
    //当任务完成后,不需要线程,需要将线程池关闭
    fixedThreadPool.shutdown();
}
/**
 * doRunTask  执行 runnable具体的方法
 */

public static void doRunTask() {//main 为 static 导致方法也必须为static
String todo = "------do run task---------";
System.out.println( "线程名称:" + Thread.currentThread().getName()+ "| 任务 |" + todo);
}
/**
* 执行具体的callable方法,并返回处理结果
* @param docall 传入需要处理的参数
* @return 返回处理结果
*/
public static String doCallable(String docall) {
String todoCall ="线程名称:" + Thread.currentThread().getName()+ " |do call task | qeques:" + docall;
return todoCall;
}
}

------------------------------------------代码实现-------------------------------------------

代码实现中才是完整代码。简书对这个优化不是很好
心得:特别注意线程池添加任务中使用遍历方法将全部任务添加,该出其实是为每个需要处理的数据创建了一个线程。但是在是使用线程池管理,线程池启动线程。所以区分最小任务单位,能创建多少任务就创建多少任务。但是具体有多少线程就看线程池有多少线程。线程创建可以参考https://www.jianshu.com/p/640630c33b4c

相关文章

  • Thread

    队列 线程锁 多线程,线程池 队列 多线程爬虫示例 多线程 自定义线程 线程池

  • Java:线程池Executors.newFixedThread

    摘要:Java,多线程,线程池 多线程编程和线程池概述 (1)多线程程序: 计算机可以实现多任务 ( multit...

  • 多线程基础--线程池

    正常项目中是不允许频繁创建线程。需要使用线程池来管理。jdk1.5后已经提供有管理线程池的API 代码实现:要求j...

  • 10.3多线程详解

    Java高级-多线程 多线程创建 多线程通讯 线程池 1.多线程创建 thread/runnable图:继承Thr...

  • Springboot | 线程池的学习,多线程池配置示例

    一、线程和进程,线程的生命周期二、单线程和多线程三、线程池的概念四、线程池的使用五、多线程池配置示例 一、线程和进...

  • Java 基础

    1. 基础语法 2. 面向对象 3. 常用API、常用类型 4. 集合 5. 多线程(线程状态、线程安全、线程池、...

  • 反射、注解与依赖注入总结

    上一篇【线程、多线程与线程池总结】中主要记录线程、多线程相关概念,侧重于线程的Future使用与线程池的操作;同样...

  • android 多线程 — 线程池基础

    线程池这个大家必会的把,就算咱是做 android 的,有现成的异步组件但是也保不齐什么时候得自己写个异步处理,再...

  • 源码分析之ThreadPoolExecutor

    线程池在多线程编程的中可谓是个利器,使用线程池会大大提高多线程的效率。原因是使用线程池相对于new Thread有...

  • Java面试题——多线程

    Java面试题——多线程 1,什么是线程池? 线程池是多线程的一种处理方式,处理过程中将任务提交给线程池,任务执行...

网友评论

      本文标题:多线程基础--线程池

      本文链接:https://www.haomeiwen.com/subject/llbpgftx.html