submit和execute,以及区别

submit和execute,以及区别

submit

submit方式适用于任务有返回结果

image-20250128203720913

方法名返回值类型描述
submit(Runnale)Future<?>提交Runnable任务
submit(Runnable,T)Future<?>提交Runnable任务并指定执行结果
submit(Callable)Future<?>提交Callable任务

他们的返回值结果都是Future对象里面,并且都带有泛型。

我们来看下Future对象;

image-20250128205749858

方法名描述
resultNow()立刻获取任务执行的结果
exceptionNow()立刻返回任务抛出的异常
get(long, TimeUnit)根据设定时间延时返回结果
get()
cancel(boolean)取消任务
state()

代码示例

ResultTask.java

class ResultTask implements Runnable {
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}

submit(Runable)

public class Test2 {
    public static void main(String[] args) {
        //创建任务
        Task task = new Task();
        //创建线程池
        ExecutorService executor = Executors.newSingleThreadExecutor();
        try {
            //提交任务
            Future<?> future = executor.submit(task);
            //打印返回结果
            System.out.println(future.get());
        }catch (InterruptedException | ExecutionException e){
            e.printStackTrace();
        }finally {
        //关闭线程池
        executor.shutdown();
        }
    }
}

执行结果,没有返回值,输出null

image-20250128214557581

submit(Runnable,T)

public class Test2 {
    public static void main(String[] args) {
        //创建任务
        Task task = new Task();
        //创建线程池
        ExecutorService executor = Executors.newSingleThreadExecutor();
        try {
            //提交任务
            Future<String> future = executor.submit(task,"ok");
            //打印返回结果
            System.out.println(future.get());
        }catch (InterruptedException | ExecutionException e){
            e.printStackTrace();
        }finally {
        //关闭线程池
        executor.shutdown();
        }
    }
}

执行结果,输出任务指定的返回结果

image-20250128214717889

submit(Callable)

package com.javaclimb;

import java.util.concurrent.*;

public class Test2 {
    public static void main(String[] args) {
        //创建任务
        ResultTask task = new ResultTask();
        //创建线程池
        ExecutorService executor = Executors.newSingleThreadExecutor();
        try {
            //提交任务
            Future<Integer> future = executor.submit(task);
            //打印返回结果
            System.out.println(future.get());
        }catch (InterruptedException | ExecutionException e){
            e.printStackTrace();
        }finally {
        //关闭线程池
        executor.shutdown();
        }
    }
}

class ResultTask implements Callable<Integer> {

    @Override
    public Integer call() throws Exception {
        return 1+1;
    }
}

执行结果:正常输出任务返回结果

image-20250128214924144

execute

execute适用于任务没有返回结果的时候

package com.javaclimb;

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

public class Test1 {
    public static void main(String[] args) {
        //创建任务
        Task task = new Task();
        //创建线程池
        ExecutorService executor = Executors.newSingleThreadExecutor();
        //提交任务
        executor.execute(task);
        //关闭线程池
        executor.shutdown();
    }
}

class Task implements Runnable {

    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName());
    }
}


执行结果,没有任何返回结果。

image-20250128214130473

execute和submit的区别总结

executesubmit
位置interface Executorinterface ExecutorService
提交任务类别RunnableRunable , Callable
返回值类型voidFuture<?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值