Java线程任务 创建一个单独的任务线程并提交到线程池中执行 案例

准备

  1. 当前文件中声明一个线程池并给定线程数量
public class App 
{
    private static final ExecutorService executorService = Executors.newFixedThreadPool(20);
    ..................
    ..................
    ..................
}
  1. 创建单独的任务线程 实现业务
public class BusinessThread implements Runnable{

    private int numbers;

    // 业务注入 可以通过 applicationContextAware 相关的类获取spring 中的bean做其他服务

    public BusinessThread(int number ) {
        this.numbers = number;
    }

    @Override
    public void run() {
        System.out.println("业务处理");
        numbers *= 2;
        System.out.println("numbers = " + numbers);
    }
}
  1. 提交任务到线程池中
    public static void main(String[] args){
        executorService.execute(new BusinessThread(6));
        executorService.shutdown();
        try {
            executorService.awaitTermination(100, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

当前的测试结果:

业务处理
numbers = 12

在 main 中单独测试时如果我没有调用 shutdown 方法时。即

    public static void main(String[] args){
        executorService.execute(new BusinessThread(6));
    }

此时结果依旧一致 但是 main 方法没有停止运行,依旧处于运行中,添加 shutdown() 后其实任务已经停止

    public static void main(String[] args){
        executorService.execute(new BusinessThread(6));
        executorService.shutdown();
    }

测试结果依旧一样。
可见 awaitTermination() 作用与JDK 接口描述的一致 其实并不是必须的。

awaitTermination() 作用即: 阻塞,直到所有任务在 shutdown 请求后完成执行,或发生超时,或当前线程中断,以先发生的为准。
即在发出 shutdown 请求后会一直阻塞到所有任务完成或者当前线程出现异常或者超过指定的超时时间。

尝试 将execute 换为 submit

    public static void main(String[] args){

        executorService.submit(new BusinessThread(6));
        executorService.shutdown();
        try {
            executorService.awaitTermination(100, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

测试后发现依旧可以照常执行,执行结果照旧:

业务处理
numbers = 12

submit()
提交一个可执行任务到线程中
execute()
在未来的某个时间执行给定的命令或任务,可能在一个新的线程中执行,也可能在一个线程池中执行,或在调用的线程中执行,这由 Executor 的实现决定。

使用 thread 的方式实现任务线程

额外定义任务如下 使用他hread 的方式

public class Business2Thread extends Thread{

    private int numbers;

    public Business2Thread(int numbers) {
        this.numbers = numbers;
    }

    @Override
    public void run() {
        System.out.println("业务2处理");
        numbers <<= 1;
        System.out.println("numbers = " + numbers);
    }
}

main 中实验如下:

    public static void main(String[] args){

        executorService.submit(new Business2Thread(6));

        executorService.execute(new BusinessThread(6));
        executorService.shutdown();
        try {
            executorService.awaitTermination(100, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

这里不论使用 submit 还是 execute 都可以,测试结果如下:

业务2处理
numbers = 12
业务处理
numbers = 12
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值