java 스레드의FutureTask

1914 단어
FutureTask는 스레드의 비동기식 계산입니다.만약 여러 개의 라인이 있다면, 모든 라인은 많은 시간을 들여 계산해야 하고, 걸리는 시간이 다르기 때문에, 마지막으로 통계를 하려면 이런 것을 써야 한다.
콜이 끝난 후에 이 방법을 실행할 수 있는 done 방법이 있습니다.
코드:
package com.concurrent;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

import junit.framework.TestCase;

public class TestFutureTask extends TestCase {
	private static final Random random = new Random();

	private static final int COUNT = 5;

	public void testFutureTask() {
		ExecutorService executorService = Executors.newFixedThreadPool(COUNT);
		List<FutureTask<Integer>> list = new ArrayList<FutureTask<Integer>>();

		for (int i = 0; i < COUNT; i++) {
			final int index = i;
			FutureTask<Integer> ft = new FutureTask<Integer>(new Callable<Integer>() {

				@Override
				public Integer call() throws Exception {
					int result = random.nextInt(10);
					System.out.println("call " + index + ", result = " + result);
					return result;
				}
			}) {

				@Override
				protected void done() {
					System.out.println("done " + index);
				}

			};
			list.add(ft);
			executorService.submit(ft);
		}

		int sum = 0;
		for (FutureTask<Integer> ft : list) {
			try {
				sum += ft.get();
			} catch (InterruptedException e) {
				e.printStackTrace();
			} catch (ExecutionException e) {
				e.printStackTrace();
			}
		}

		System.out.println("sum = " + sum);
		executorService.shutdown();
	}

}

출력:
call 0, result = 6
call 1, result = 5
call 2, result = 4
done 1
done 2
done 0
call 3, result = 2
done 3
call 4, result = 9
done 4
sum = 26

좋은 웹페이지 즐겨찾기