色空大师 2024-09-05 14:49 采纳率: 40.9%
浏览 3

使用线程池跑线程,当第一步进行完后暂停一秒,然后去跑第二步,没有打印第二部信息

使用线程池跑线程,当第一步进行完后暂停一秒,然后去跑第二步,没有打印第二部信息
线程池配置如下:

package com.test.pool.config;

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.CustomizableThreadFactory;

import java.util.concurrent.SynchronousQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

@Configuration
public class ThreadConfig {

    @Qualifier("simpleExecutor")
    @Bean
    public ThreadPoolExecutor simpleExecutor() {
        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(16,
                16,
                10,
                TimeUnit.MINUTES,
                new SynchronousQueue<>(),
                new CustomizableThreadFactory("simple-pool-"),
                new ThreadPoolExecutor.AbortPolicy());
        threadPoolExecutor.allowCoreThreadTimeOut(true);
        return threadPoolExecutor;
    }
}


测试类如下


package com.test.pool;

import com.test.pool.thread.MyThreadTest;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.util.concurrent.ExecutorService;

@RunWith(SpringRunner.class)
@SpringBootTest
@Slf4j
public class SimpleThreadTest {

    @Resource
    ExecutorService simpleExecutor;

    @Test
    public void simpleThreadTest(){
        simpleExecutor.submit(()->{
            log.info("进入simpleThreadTest");
            try {
                first();
                Thread.sleep(100);
            }catch (Exception e){
                log.error("sleep error");
            }
            second();
        });
    }

    public void first(){
        log.info("first");
    }

    public void second(){
        log.info("second");
    }
}


运行结果如下:

img


问:第二步的信息呢?0.1秒应该很快啊

展开全部

  • 写回答

1条回答 默认 最新

  • 编程巫师 全栈领域优质创作者 2024-09-06 07:31
    关注

    在内部子线程执行到second()方法之前,主线程已经执行结束了,你需要使用future.get()方法等待子线程执行完

    
        @Test
        public void simpleThreadTest(){
            Future<?> future = simpleExecutor.submit(()->{
                log.info("进入simpleThreadTest");
                try {
                    first();
                    Thread.sleep(100);
                }catch (Exception e){
                    log.error("sleep error");
                }
                second();
            });
            try {
                future.get();
            }catch (Exception e){
                log.error("future error");
            }
        }
    
    
    评论
    编辑
    预览

    报告相同问题?

    问题事件

    • 创建了问题 9月5日

    悬赏问题

    • ¥15 PADS Logic 原理图
    • ¥15 PADS Logic 图标
    • ¥15 电脑和power bi环境都是英文如何将日期层次结构转换成英文
    • ¥20 气象站点数据求取中~
    • ¥15 如何获取APP内弹出的网址链接
    • ¥15 wifi 图标不见了 不知道怎么办 上不了网 变成小地球了
    手机看
    程序员都在用的中文IT技术交流社区

    程序员都在用的中文IT技术交流社区

    专业的中文 IT 技术社区,与千万技术人共成长

    专业的中文 IT 技术社区,与千万技术人共成长

    关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

    关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

    客服 返回
    顶部