Main.java Source code

Java tutorial

Introduction

Here is the source code for Main.java

Source

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Main {
    static Random rand = new Random();
    static final Lock lock = new ReentrantLock();
    static boolean updating = false;
    static List<Future<Integer>> futureList = new ArrayList<Future<Integer>>();
    static ExecutorService pool = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
    static Callable<Integer> callable = new Callable<Integer>() {
        @Override
        public Integer call() {
            return rand.nextInt();
        }
    };

    static void doUpdate() {
        if (lock.tryLock()) {
            updating = true;
            try {
                for (Future<Integer> future : futureList) {
                    System.out.println(future.get());
                }
                futureList.clear();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                System.out.println();
                lock.unlock();
                updating = false;
            }
        }
    }

    public static void main(String[] args) throws Exception {
        new Thread(() -> {
            int submitCount = 0;
            while (submitCount < 10) {
                if (!updating) {
                    futureList.add(pool.submit(callable));
                    submitCount++;
                }
                try {
                    Thread.sleep(1000); // arbitrary
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
        // update thread
        new Thread(() -> {
            int updateCount = 0;
            while (updateCount < 5) {
                doUpdate();
                updateCount++;
                try {
                    Thread.sleep(2000);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
}