1. 程式人生 > 實用技巧 >springboot 整合執行緒池(通俗易懂)

springboot 整合執行緒池(通俗易懂)

廢話少說,直接上程式碼

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.*; @Configuration @EnableAsync public class SpringAsyncConfig { @Bean public Executor asyncServiceExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); // 設定核心執行緒數 executor.setCorePoolSize(5); // 設定最大執行緒數 executor.setMaxPoolSize(20);
//配置佇列大小 executor.setQueueCapacity(Integer.MAX_VALUE); // 設定執行緒活躍時間(秒) executor.setKeepAliveSeconds(60); // 設定預設執行緒名稱 executor.setThreadNamePrefix("獲取旺旺資訊"); // 等待所有任務結束後再關閉執行緒池 executor.setWaitForTasksToCompleteOnShutdown(true); //執行初始化 executor.initialize();
return executor; } }

controller層

 
import com.yzx.caasscs.controller.BaseController;
import com.yzx.caasscs.service.Thread.AsyncService;
import com.yzx.caasscs.vo.ResultVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
/**
 * @author qjwyss
 * @date 2018/10/12
 * @description
 */
@RestController
public class ThreadController extends BaseController {
 
    private static final Logger logger = LoggerFactory.getLogger(ThreadController.class);
 
    @Autowired
    private AsyncService asyncService;
 
    @GetMapping("/sss")
    public ResultVO<Void> sss(){
 
        //呼叫service層的任務
        asyncService.executeAsync();
 
        return ResultVO.getSuccess("OK");
    }
}

service

public interface AsyncService {
 
    /**
     * 執行非同步任務
     */
    void executeAsync();
 
}

serviceImpl

 
import com.yzx.caasscs.service.Thread.AsyncService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
 

@Service
public class AsyncServiceImpl implements AsyncService {
 
    private static final Logger logger = LoggerFactory.getLogger(AsyncServiceImpl.class);
 
 
    @Async("taskExecutor")
    @Override
    public void executeAsync() {
        logger.info("start executeAsync");
        try {
            System.out.println("當前執行的執行緒名稱:" + Thread.currentThread().getName());
        } catch (Exception e) {
            e.printStackTrace();
        }
        logger.info("end executeAsync");
    }
 
}

@Async和@EnableAsync要結合使用,才能發揮非同步的效果

建議把所有帶有@Async的方法都放到同一個類裡,不然很容易出現迴圈依賴的問題