多线程 submit与execute区别

(1)可以接受的任务类型

submit:

execute:

可以看出:

execute只能接受Runnable类型的任务

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

(2)返回值

由Callable和Runnable的区别可知:

execute没有返回值

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

(3)异常

1.execute中抛出异常

execute中的是Runnable接口的实现,所以只能使用try、catch来捕获CheckedException,通过实现UncaughtExceptionHande接口处理UncheckedException

即和普通线程的处理方式完全一致

2.submit中抛出异常

不管提交的是Runnable还是Callable类型的任务,如果不对返回值Future调用get()方法,都会吃掉异常

先来看下Callable定义

  1. public interface Callable<V> {

  2.  

  3.  

    V call() throws Exception;

  4.  

  5.  

    }

其中的call能够抛出Exception异常,所以不管是CheckedException还是UncheckedException,直接抛出即可

  1. import java.util.concurrent.Callable;

  2.  

  3.  

    import java.util.concurrent.ExecutionException;

  4.  

  5.  

    import java.util.concurrent.ExecutorService;

  6.  

  7.  

    import java.util.concurrent.Executors;

  8.  

  9.  

    import java.util.concurrent.Future;

  10.  

  11.  

  12.  

    public class ThreadExceptionTest {

  13.  

  14.  

    public static void main(String[] args) {

  15.  

  16.  

    ExecutorService executor = Executors.newCachedThreadPool();

  17.  

  18.  

  19.  

    Future<Boolean> future = executor.submit(new CallableTask());

  20.  

  21.  

    try {

  22.  

  23.  

    future.get();

  24.  

  25.  

    } catch (InterruptedException e) {

  26.  

  27.  

    e.printStackTrace();

  28.  

  29.  

    } catch (ExecutionException e) {

  30.  

  31.  

    e.printStackTrace();

  32.  

  33.  

    }

  34.  

  35.  

  36.  

    executor.shutdown();//必须不能忘,否则会一致卡在那里

  37.  

  38.  

    }

  39.  

  40.  

    }

  1. class CallableTask implements Callable<Boolean>{

  2.  

  3.  

    public Boolean call() throws Exception {

  4.  

  5.  

    // InputStream in = new FileInputStream(new File("xx.pdf"));

  6.  

  7.  

    int num = 3/0;

  8.  

  9.  

    return false;

  10.  

  11.  

    }

  12.  

  13.  

  14.  

    }

结果为:

java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero

at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222)

at java.util.concurrent.FutureTask.get(FutureTask.java:83)

at my.ThreadExceptionTest.main(ThreadExceptionTest.java:21)

Caused by: java.lang.ArithmeticException: / by zero

at my.CallableTask.call(ThreadExceptionTest.java:57)

at my.CallableTask.call(ThreadExceptionTest.java:1)

at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)

at java.util.concurrent.FutureTask.run(FutureTask.java:138)

at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)

at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)

at java.lang.Thread.run(Thread.java:619)

--------------------- 本文来自 cpf2016 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/cpf2016/article/details/50150205?utm_source=copy

原文地址:https://www.cnblogs.com/renjiaqi/p/10248076.html

时间: 2024-08-30 13:05:53

多线程 submit与execute区别的相关文章

Callable与Runable接口 submit与execute区别

execute(Runnable x) 没有返回值.可以执行任务,但无法判断任务是否成功完成. submit(Runnable x) 返回一个future.可以用这个future来判断任务是否成功完成. 在Java5之后,任务分两类:一类是实现了Runnable接口的类,一类是实现了Callable接口的类. 两者都可以被ExecutorService执行 Future future = pool.submit(new RunnableTest("Task2"));         

多线程ExecutorService中submit和execute区别

submit和execute都是 ExecutorService 的方法,都是添加线程到线程池中. 区别 三个区别: 1.接收的参数不一样 2.submit有返回值,而execute没有 Method submit extends base method Executor.execute by creating and returning a Future that can be used to cancel execution and/or wait for completion. 用到返回值

并发编程之submit和execute区别

前言 使用线程池难免会用到submit和execute,但是submit是有坑的,此处做个记录 1.submit坑 此处随便写一个方法,进入内部查看execute和submit /** * @Author: 小混蛋 * @CreateDate: 2018/8/29 9:58 */ @Component public class Test { public static void main(String[] args) { ExecutorService es = Executors.newFix

ExecutorService中submit()和execute()的区别

在使用java.util.concurrent下关于线程池一些类的时候,相信很多人和我一样,总是分不清submit()和execute()的区别,今天从源码方面分析总结一下. 通常,我们通过Executors这个工具类提供多种方法来创建适合不同场景的线程池,这里就不一一介绍了. 例如,创建可缓存线程池,Executors.newCachedThreadPool(),源码如下: 1 public static ExecutorService newCachedThreadPool() { 2 re

Java多线程Runnable与Callable区别与拓展

我们先来分别看一下这两个接口 Runnable: 1 // 2 // Source code recreated from a .class file by IntelliJ IDEA 3 // (powered by Fernflower decompiler) 4 // 5 6 package java.lang; 7 8 @FunctionalInterface 9 public interface Runnable { 10 void run(); 11 } 只有一个方法run(),表示

多线程和多进程的区别与联系

1.单进程单线程:一个人在一个桌子上吃菜.2.单进程多线程:多个人在同一个桌子上一起吃菜.3.多进程单线程:多个人每个人在自己的桌子上吃菜. 多线程的问题是多个人同时吃一道菜的时候容易发生争抢,例如两个人同时夹一个菜,一个人刚伸出筷子,结果伸到的时候已经被夹走菜了...此时就必须等一个人夹一口之后,在还给另外一个人夹菜,也就是说资源共享就会发生冲突争抢. 1.对于 Windows 系统来说,[开桌子]的开销很大,因此 Windows 鼓励大家在一个桌子上吃菜.因此 Windows 多线程学习重点

java创建多线程方法之间的区别

我们知道java中创建多线程有两种方法(详见http://blog.csdn.net/cjc211322/article/details/24999163).那么两者有什么区别呢? 一.情形一 code1 /** * ThreadTestDemo.java * @author cjc * */ public class ThreadTestDemo { public static void main(String[] args) { Ticket t=new Ticket(); t.start(

多线程和多进程的区别

(重点 面试官最最关心的一个问题,必须从cpu调度,上下文切换,数据共享,多核cup利用率,资源占用,等等各方面回答,然后有一个问题必须会被问到:哪些东西是一个线程私有的?答案中必须包含寄存器,否则悲催) 可重入:概念基本没有比较正式的完整解释,但是它比线程安全要求更严格.根据经验,所谓"重入",常见的情况是,程序执行到某个函数foo()时,收到信号,于是暂停目前正在执行的函数,转到信号处理函数,而这个信号处理函数的执行过程中,又恰恰也会进入到刚刚执行的函数foo(),这样便发生了所谓

ExecutorService中submit和execute的区别&lt;转&gt;

在Java5之后,并发线程这块发生了根本的变化,最重要的莫过于新的启动.调度.管理线程的一大堆API了.在Java5以后,通过Executor来启动线程比用Thread的start()更好.在新特征中,可以很容易控制线程的启动.执行和关闭过程,还可以很容易使用线程池的特性. 一.创建任务 任务就是一个实现了Runnable接口的类. 创建的时候实run方法即可. 二.执行任务 通过java.util.concurrent.ExecutorService接口对象来执行任务,该接口对象通过工具类ja