美文网首页
11.线程池-4

11.线程池-4

作者: nieniemin | 来源:发表于2021-08-07 21:20 被阅读0次

execute和submit的区别

相同点:

1 都可以执行任务
2 参数都支持runnable

submit
execute

从图中可以看到两者的区别如下:

(1)来源

execute是Executor接口中的方法
submit是AbstractExecutorService中的方法

(2)接收参数类型

execute只能接受Runnable类型的任务
submit不管是Runnable还是Callable类型的任务都可以接受,但是Runnable返回值均为void,所以使用Future的get()获得的还是null

(3)返回值

execute没有返回值
submit有返回值,所以需要返回值的时候必须使用submit

(4)异常

execute中的是Runnable接口的实现,所以只能使用try、catch来捕获CheckedException,通过实现UncaughtExceptionHande接口处理UncheckedException
不管提交的是Runnable还是Callable类型的任务,如果不对返回值Future调用get()方法,都会吃掉异常。

package executors.threadpool;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
* <p></p>
*
* @author : wangdejian
* @version 1.0
* @date : 2021/8/4 21:01
*/
public class ThreadPoolExecute {
   public static void main(String[] args) {
       myTask();

   }

   public static void myTask() {

       ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,
               5,
               5,
               TimeUnit.MINUTES,
               new ArrayBlockingQueue<>(6));

       for (int i = 0; i < 12; i++) {
           int tmp = i;
           threadPoolExecutor.execute(() -> {

               try {
                   System.out.println("--->" + Thread.currentThread().getName() + "--" + tmp);
                   Thread.sleep(1_000);
               } catch (InterruptedException e) {
                   e.printStackTrace();
               }
           });
       }
       threadPoolExecutor.shutdown();
   }
}

public class ThreadPoolSubmit {
    public static void main(String[] args) throws ExecutionException, InterruptedException {

        Callable<Map<String, String>> callable = () -> {
            Map<String, String> map = new HashMap<>();
            try {
                Thread.sleep(1_000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            String toString = Thread.currentThread().toString();

            String name = Thread.currentThread().getName();
            System.out.println("toString=" + toString + ";name=" + name);
            map.put("toString", Thread.currentThread().toString());
            map.put("name", name);

            return map;
        };

        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(5, 10,
                5, TimeUnit.MINUTES,
                new ArrayBlockingQueue<Runnable>(10));
        for (int i = 0; i < 10; i++) {
            Future<Map<String, String>> submit = threadPoolExecutor.submit(callable);
            System.out.println(submit.get().get("name"));
            System.out.println(submit.get().get("toString"));
        }

    }

}

相关文章

  • 11.线程池-4

    execute和submit的区别 相同点: 1 都可以执行任务2 参数都支持runnable 从图中可以看到两者...

  • JUC(11) - 线程池

    11. 线程池 第四种获取线程的方法:线程池,一个 ExecutorService,它使用可能的几个池线程之一执行...

  • 线程池学习笔记

    1、线程池的定义 2、Executors创建线程池的方式 3、ThreadPoolExecutor对象 4、线程池...

  • 线程池

    1、为什么要使用线程池2、线程池的工作原理3、线程池参数4、阻塞队列5、饱和策略6、向线程池提交任务7、线程池的状...

  • 9.jdk线程池详解及实际运用

    4.线程池 参数 1)corePoolSize: 线程池的基本大小,当提交一个任务到线程池中,线程池会创建一个线程...

  • 大白话聊聊线程池的工作原理和核心参数

    目录 1、为啥要使用线程池 2、线程池的工作原理 3、线程池都用哪些核心参数 4. 有界队列下的线程池的工作流程 ...

  • Kevin Learn Android:线程池(ThreadPo

    简介 使用 4 种常见线程池 定长线程池(FixedThreadPool) 特点:只有核心线程 & 不会被回收、线...

  • pthread 创建的动态线程池

    组织结构: 1,缓存工作的任务池,任务节点 2,存储工作线程的池,线程节点 3,任务池投递到工作线程的线程 4,工...

  • java中4种常用线程池

    java中4种常用线程池 一、线程池 线程池:说白了,就是一种线程使用模式。线程过多会带来调度开销,进而影响整体性...

  • JDK多任务执行框架

    1、为什么要使用线程池?2、线程池有什么作用?3、说说几种常见的线程池及使用场景。4、线程池都有哪几种工作队列?5...

网友评论

      本文标题:11.线程池-4

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