springboot项目线程使用

Posted 宇翊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springboot项目线程使用相关的知识,希望对你有一定的参考价值。

下面是一个demo:

public class TestThread {

    
    private static int nThreads =Runtime.getRuntime().availableProcessors() * 2 + 1;  //创建的线程数理论最优值是cpu核数的2n+1
    
    private static ExecutorService executors = Executors.newFixedThreadPool(nThreads, new ThreadFactory() {  //创建线程池
        
        private final String threadNamePrefix="thread_name_task_";
        
        private final AtomicInteger count = new AtomicInteger(1);//原子性操作,保证每个线程数值的安全性
        
        
        @Override
        public Thread newThread(Runnable r) {
            Thread t = new Thread(Thread.currentThread().getThreadGroup(),r,threadNamePrefix + count.getAndIncrement());
            t.setDaemon(true);
            return t;
        }
    });
    

    
        public static void main(String[] args) {
            
            List<Future<String[]>> fList = new ArrayList<>();
            
            
            for (int i = 0; i < 10; i++) {
                final int nextInt = new Random().nextInt(100);
                Future<String[]> f  =  executors.submit(new TestTask(nextInt));
                
                fList.add(f);
            }
            
            /*for (Future<String[]> future : fList) {
                try {
                    String [] result = future.get();
                    System.out.println(result[0]  + " , 结果   "  + result[1]);
                } catch (InterruptedException e) {
                } catch (ExecutionException e) {
                }
            }
            
            
            
            System.out.println("main 线程结束 ");
            
        }
        
        
    static class TestTask  implements Callable<String[]> {
        
            private int i ;
            
            public TestTask(int i){
                this.i = i;
            }
            
            @Override
            public String[] call() throws Exception {
                String result =  i%2 == 0 ? "S" : "F";
                // 业务处理逻辑
                //Thread.sleep(1000);
                System.out.println(Thread.currentThread().getName() + "第" + i + "次任务");
                return new String[] {Thread.currentThread().getName(),result};
            }
     }
}

线程异步执行结果:

 

以上是关于springboot项目线程使用的主要内容,如果未能解决你的问题,请参考以下文章

springboot项目线程使用

newCacheThreadPool()newFixedThreadPool()newScheduledThreadPool()newSingleThreadExecutor()自定义线程池(代码片段

java开发的项目案例,大厂内部资料

SpringBoot 项目启动后执行代码

SpringBoot项目使用多线程处理任务时无法通过@Autowired注入bean

SpringBoot项目@Async默认线程池导致OOM问题?