线程池execute方法与submit方法区别

前面写了【线程池execute方法的源码解析】【线程池submit方法源码解析】,在这里简单记下execute方法与submit方法的区别。
方法传参

execute方法只能传Runnable对象

void execute(Runnable command);

submit方法可以传Runnable对象和Callable对象

<T> Future<T> submit(Callable<T> task);

<T> Future<T> submit(Runnable task, T result);

Future<?> submit(Runnable task);

方法返回值

execute方法传递Runnable 对象,重写的run方法是由void修饰的,没有返回值;

submit方法传Runnable对象时,也是没有返回值的,但是传递Callable对象时,重写的是call方法,它是有返回值的。

对异常的处理

execute方法会直接抛出异常;

package com.su.mybatis.oracle.controller;
 
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class Test {
 
    public static void main(String[] args) {
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
        for(int i = 0;i<3;i++){
            final int num = i;
            fixedThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                    if(num ==2) {
                        System.out.println(1/0);
                    }else {
                        System.out.println(Thread.currentThread().getName() + "正在执行,num = " + num);
                    }
                }
            });
        }
        fixedThreadPool.shutdown();
        System.out.println("main执行完成");
    }
}

输出结果:

pool-1-thread-1正在执行,num = 0
main执行完成
pool-1-thread-2正在执行,num = 1
Exception in thread "pool-1-thread-3" java.lang.ArithmeticException: / by zero
	at com.su.mybatis.oracle.controller.Test$1.run(Test.java:16)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:744)

 submit方法不会直接抛出,异常会赋值给outcome字段,但是你可以使用future.get()获得。

package com.su.mybatis.oracle.controller;
 
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
 
public class Test {
 
    @SuppressWarnings({ "unchecked", "rawtypes", "unused" })
    public static void main(String[] args) {
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
        for(int i = 0;i<3;i++){
            final int num  = i;
            Future<Boolean> future = fixedThreadPool.submit(new Callable() {
                @Override
                public Boolean call() throws Exception {
                    if(num ==2) {
                        System.out.println(1/0);
                    }else {
                        System.out.println(Thread.currentThread().getName() + "正在执行,num = " + num);
                    }
                    return true;
                }
            });
        }
        fixedThreadPool.shutdown();
        System.out.println("main执行完成");
    }
}

输出结果:

main执行完成
pool-1-thread-2正在执行,num = 1
pool-1-thread-1正在执行,num = 0

使用future.get()获取异常

package com.su.mybatis.oracle.controller;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
 
public class Test {
 
    @SuppressWarnings({ "unchecked", "rawtypes"})
    public static void main(String[] args) {
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(4);
        for(int i = 0;i<3;i++){
            final int num  = i;
            Future<Boolean> future = fixedThreadPool.submit(new Callable() {
                @Override
                public Boolean call() throws Exception {
                    if(num ==2) {
                        System.out.println(1/0);
                    }else {
                        System.out.println(Thread.currentThread().getName() + "正在执行,num = " + num);
                    }
                    return true;
                }
            });
            try {
                System.out.println(future.get());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
        fixedThreadPool.shutdown();
        System.out.println("main执行完成");
    }
}

输出结果:

pool-1-thread-1正在执行,num = 0
true
pool-1-thread-2正在执行,num = 1
true
java.util.concurrent.ExecutionException: java.lang.ArithmeticException: / by zero
	at java.util.concurrent.FutureTask.report(FutureTask.java:122)
	at java.util.concurrent.FutureTask.get(FutureTask.java:188)
	at com.su.mybatis.oracle.controller.Test.main(Test.java:28)
Caused by: java.lang.ArithmeticException: / by zero
	at com.su.mybatis.oracle.controller.Test$1.call(Test.java:20)
	at com.su.mybatis.oracle.controller.Test$1.call(Test.java:1)
	at java.util.concurrent.FutureTask.run(FutureTask.java:262)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
	at java.lang.Thread.run(Thread.java:744)
main执行完成

 

 

 

如果有写的不对的地方,请大家多多批评指正,非常感谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值