코드를 병렬로 실행하는 태스크 개발
Callable 또는 Runnable로 코드 줄을 바꾼 다음 관리 실행자로 제출 또는 스케줄하여 병렬로 조작을 수행할 수 있습니다.
시작하기 전에
선택적으로, 관리자는 콘솔을 사용하여 하나 이상의 작업 관리자를 구성할 수 있거나 관리 기본 작업 관리자의 설정을 변경할 수 있습니다.
이 태스크 정보
병렬로 코드를 실행하면 Callable 또는 Runnable로 코드 줄을 바꾸고 관리 실행자로 제출 또는 스케줄해야 합니다.
프로시저
- Callable 또는 Runnable 태스크를 구현하십시오.
태스크는 java.util.concurrent.Callable 인터페이스 또는 java.lang.Runnable 인터페이스를 구현합니다. 예를 들어, 주제 및 모든 컴포넌트에 동적으로 등록하는 태스크를 작성할 수 있습니다.
class SampleTask implements Callable<Object> { Set<MessageListener> listeners = Collections.newSetFromMap(new ConcurrentHashMap<MessageListener, Boolean>(); Topic targetTopic; TopicConnectionFactory tcf; public SampleWork(TopicConnectionFactory tcf, Topic targetTopic) { this.targetTopic = targetTopic; this.tcf = tcf; } public void addMessageListener(MessageListener listener) { listeners.add(listener); } public Object call() throws JMSException { // setup our JMS stuff.TopicConnection tc = tcf.createConnection(); try { TopicSession sess = tc.createSession(false, Session.AUTOACK); tc.start(); while( !Thread.currentThread().isInterrupted() ) { // block for up to 5 seconds. Message msg = sess.receiveMessage(5000); if(msg != null) for (MessageListener listener : listeners) listener.onMessage(msg); } tc.close(); } finally { if (tc != null) tc.close(); } } }
결과적으로 모든 컴포넌트는 필요 시 메시지 리스너를 추가할 수 있으며, 이를 통해 컴포넌트가 각각의 클라이언트 등록자에 고유 스레드를 제공하는 것보다 더욱 확장 가능 방식으로 주제에 등록할 수 있습니다.
- 이 애플리케이션 컴포넌트에 필요한 작업 관리자 수를 판별하십시오.
- 관리 실행자, 스레드 팩토리, 컨텍스트 서비스 자원 환경 참조 또는 java:comp 네임스페이스에서
작업 관리자 자원 참조(또는 논리 이름)을 사용하여 작업 관리자를 검색하십시오. (자원 환경 참조 및 자원 참조에 대한 자세한 정보는 참조 주제를 참조하십시오.)
관리 실행자에 대한 자원 환경 참조(예: concurrent/myWorkManager)는 애플리케이션 배치 디스크립터의 자원 환경 참조 또는 @Resource 어노테이션으로 선언되어야 합니다.InitialContext ic = new InitialContext(); ManagedExecutorService executor = (ManagedExecutorService)ic.lookup("java:comp/env/concurrent/myWorkManager");
- Callable 또는 Runnable 태스크 인스턴스를 매개변수로 사용하여 ManagedExecutorService.submit() 메소드를 호출하십시오. 예를 들어 다음과 같습니다.
Callable<Boolean> task = new MyTask(...); Future<Boolean> future = executor.submit(task);
Future는 컴포넌트에서 제출된 태스크 간의 링크를 제공하는 핸들입니다.
- 옵션: 애플리케이션 컴포넌트가 하나 이상의 태스크의 완료를 기다려야 하는 경우 Future.get() 메소드를 호출하십시오. 예를 들어 다음과 같습니다.
Future<String> futureA = executor.submit(taskA); Future<String> futureB = executor.submit(taskB); futureA.get(5, TimeUnit.SECONDS); futureB.get(5, TimeUnit.SECONDS);
또는, invokeAll() 메소드를 사용하여 다중 태스크를 제출하고 완료될 때까지 기다릴 수 있습니다. 예를 들어 다음과 같습니다.
tasks = Arrays.asList(taskA, taskB); futures = executor.invokeAll(tasks, 5, TimeUnit.SECONDS); // we can check future.isDone() to see which, if any, finished.
이 메소드는 컴포넌트가 모든 작업 오브젝트의 완료를 기다리는 태스크의 콜렉션을 사용합니다. 또한 제한시간 값을 지정할 수 있습니다.
- Future.cancel(true) 메소드를 사용하여 태스크를 인터럽트하도록 하십시오.
태스크를 구현하여 인터럽트에 즉각적으로 응답하거나 가능하면 빨리 실행을 중지하십시오.
하위 주제
Callable 및 Runnable 태스크
Concurrency Utilities for Java EE에서, Callable 또는 Runnable 태스크는 제출 스레드의 Java EE(Java Platform, Enterprise Edition) 컨텍스트와 병렬로 코드를 실행하기 위해 애플리케이션 컴포넌트에 의해 사용됩니다.예제: Callable 및 Runnable 태스크 작성
주제 및 모든 컴포넌트에 동적으로 등록하는 태스크를 작성할 수 있으며 필요 시 메시지 리스너를 추가할 수 있습니다.예제: 동시성으로 연결 사용
Runnable 또는 Callable은 java:comp 자원 참조를 사용하여 작성 컴포넌트가 확보한 연결을 사용할 수 있습니다.
관련 개념:


http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tasb_devwkobj
파일 이름:tasb_devwkobj.html