여러 스레드에서 여러 작업을 모두 수행한 후 TaskExecutorConfig CountDownLatch로 일괄 복귀

3874 단어 기술 인생
다중 스레드 구현 방식
 java.util.concurrent 패키지 아래의 클래스 Executor
java.util.concurrent       ExecutorService pool = Executors.newCachedThreadPool();  4                  

springboot 프로젝트에서 프레임워크에 봉인된 스레드 탱크와 주석을 이용하여 비동기를 실현할 수 있다는 것이 이번 설명의 중점입니다
우선 구성 클래스
 
@Component
@Configuration
public class TaskExecutorConfig implements AsyncConfigurer{

	@Override
	@Bean
	public Executor getAsyncExecutor() {
		ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
		taskExecutor.setCorePoolSize(20);//          
		taskExecutor.setMaxPoolSize(50);//          
		taskExecutor.setKeepAliveSeconds(8);//    s
		taskExecutor.setAwaitTerminationSeconds(3);//        s
		taskExecutor.initialize();//    
		taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
		return taskExecutor;
	}

	@Override
	public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
		return new ExceptionHandlingAsyncTaskExecutor();
	}

}

하위 라인 이상 처리 방법을 정의합니다. 다중 라인이 실행될 때 하위 라인의 이상은 매번 출력되지 않습니다. 이 클래스를 설정해서 하위 라인의 이상을 출력해야 합니다.
@Component
@Configuration
public class ExceptionHandlingAsyncTaskExecutor implements AsyncUncaughtExceptionHandler{
	
private static final Logger logger  = LoggerFactory.getLogger(ExceptionHandlingAsyncTaskExecutor.class);

	@Override
	public void handleUncaughtException(Throwable ex, Method method, Object... params) {
		logger.info("Method name - " + method.getName());
		logger.info("Exception message - " + ex.getMessage());
         for (Object param : params) {
        	 logger.info("Parameter value - " + param);
         }  
     }  
	
}

부트 클래스에 설정 추가
@EnableAsync
@SpringBootApplication
public class Application {

	public static void main(String[] args) {
		SpringApplication.run(Application.class, args);
	}

	
}
                 @Async                         
    @Async
    @Override
    public List getMbiIndex(CountDownLatch downLatch) {
        downLatch.countDown();
    }
  :              service                 ,                       

여기에 대상 CountDownLatch가 필요합니다.
//      cout          
 public CountDownLatch(int count) {
        if (count < 0) throw new IllegalArgumentException("count < 0");
        this.sync = new Sync(count);
    }


//                
public void await() throws InterruptedException {
        sync.acquireSharedInterruptibly(1);
    }
//                            
    public boolean await(long timeout, TimeUnit unit)
        throws InterruptedException {
        return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));
    }

//                                   

    public void countDown() {
        sync.releaseShared(1);
    }

주된 방법
public Object mian(){
CountDownLatch downLatch= new CountDownLatch(3);

Future list1=test1(downLatch)
Future list2=test2(downLatch)
Future list3=test3(downLatch)
 
downLatch.await(4L, TimeUnit.SECONDS);

return  list1.get();
}
 
Future test1(CountDownLatch downLatch){

.........
downLatch.countDown();
return new AsyncResult(new ArrayList());
}
테스트 2 () 와 테스트 3 () 도 이downLatch를 호출해야 합니다.countDown();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

좋은 웹페이지 즐겨찾기