1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| public class MultipleThreadPrint { private static final int CORE_SIZE = 5; private static final int MAX_SIZE = 10; private static final long KEEP_ALIVE_TIME = 1L; private static final int QUEUE_SIZE = 10; private static final ThreadPoolExecutor executor = new ThreadPoolExecutor( CORE_SIZE, MAX_SIZE, KEEP_ALIVE_TIME, TimeUnit.MINUTES, new LinkedBlockingQueue<>(QUEUE_SIZE), new ThreadPoolExecutor.CallerRunsPolicy() );
private static int counter = 0; static class Task implements Callable { private final String NAME; private final int TARGET_NUM; private final int SUM_NUM; private final int PRINT_TIMES; public Task(String name, int targetNum, int sumNum, int printTimes) { this.NAME = name; this.TARGET_NUM = targetNum; this.SUM_NUM = sumNum; this.PRINT_TIMES = printTimes; } @Override public Object call() { for (int i = 0; i < PRINT_TIMES; i++) { synchronized (MultipleThreadPrint.class) { while (counter % SUM_NUM != TARGET_NUM) { try { MultipleThreadPrint.class.wait(); } catch (Exception e) { e.printStackTrace(); } }
System.out.println(NAME + ": " + counter); counter++; MultipleThreadPrint.class.notifyAll(); } }
return null; } }
public static void main(String[] args) { Task task1 = new Task("A", 0, 3, 10); Task task2 = new Task("B", 1, 3, 10); Task task3 = new Task("C", 2, 3, 10);
executor.submit(task1); executor.submit(task2); executor.submit(task3); } }
|