package com.demo.test;

import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Date;
import java.util.concurrent.*;

@SpringBootTest
public class CompletionServiceTest {
	@Test
	public void test() throws ExecutionException, InterruptedException {
		//future.get() 阻塞 date相同
//        ExecutorService executorService = Executors.newFixedThreadPool(10);
//        for (int i = 0; i < 5; i++) {
//            Future future = executorService.submit(new CallableTest(new SendTest()));
//            Future future2 = executorService.submit(new CallableTest2(new SendTest()));
//            System.out.println(""+future.get()+new Date());
//            System.out.println(""+future2.get()+new Date());
//        }
		//使用CompletionService不会阻塞
		ExecutorService executorService = Executors.newFixedThreadPool(10);
		CompletionService completionService = new ExecutorCompletionService(executorService);
		for (int i = 0; i < 5; i++) {
			completionService.submit(new CallableTest(new SendTest()));
			completionService.submit(new CallableTest2(new SendTest()));
			//completionService.take()也是阻塞,如果只有两个任务,第三个take阻塞,poll不会阻塞
			System.out.println("" + completionService.take().get() + new Date());
			System.out.println("" + completionService.take().get() + new Date());
//            System.out.println("" + completionService.take().get() + new Date());
		}

	}
}

class CallableTest implements Callable {
	SendTest sendTest;

	CallableTest(SendTest sendTest) {
		this.sendTest = sendTest;
	}

	@Override
	public Object call() throws Exception {
		Thread.sleep(5000);
		sendTest.send();
		return "11111" + ":" + Thread.currentThread();
	}
}

class CallableTest2 implements Callable {
	SendTest sendTest;

	CallableTest2(SendTest sendTest) {
		this.sendTest = sendTest;
	}

	@Override
	public Object call() throws Exception {
		Thread.sleep(2000);
		sendTest.send();
		return "22222" + ":" + Thread.currentThread();
	}
}

class SendTest {
	public void send() {
//        System.out.println("send"+new Date()+":"+Thread.currentThread());
	}
}