Могу ли я напечатать эти идентификаторы в порядке возрастания их версий? - PullRequest
0 голосов
/ 28 апреля 2019

This is the multithreaded output У меня есть входной набор, у которого есть x идентификаторов с соответствующими версиями. Идентификатор может иметь несколько версий, но все они будут в порядке возрастания во входном наборе. Я использую службу Executor, которая принимает определенное количество потоков, некоторое время ожидает (для имитации задержки ввода / вывода) и выводит ID и версию на консоль. Я хочу убедиться, что консоль печатает все версии ID в порядке возрастания. Я могу изменять только функцию add () и метод run, а также добавлять переменные класса, если это необходимо.

Я пытался использовать Hashmaps для установки значений идентификатора в true, когда поток работает с элементом данных с указанным идентификатором. Каждый раз, когда вызывается метод run, он проверяет, имеет ли карта значение идентификатора true; если так, то это должно подождать. если нет, выполнить. Что-то не так с кодом, так что я думаю, что в основном это проблема понимания методов.

Класс элемента данных, который будет входным. (Набор элементов данных)

public class DataItem {
    private int id;
    private int version;
    private long amount;

    public DataItem(int id, int version, long amount) {
        super();
        this.id = id;
        this.version = version;
        this.amount = amount;
    }
}

Класс Feedprocessor, который добавляет потоки в пул

public class FeedProcessor extends AbstractFeedProcessor {
    public Map<Integer,Boolean> lock_set = new HashMap<Integer,Boolean>();
    private ExecutorService threadPool = Executors.newFixedThreadPool(3);

    public FeedProcessor() {

    }

    public void add(DataItem item) {
            threadPool.submit(new ProcessTask(item));       
        }

}

Класс processstask, который реализует выполняемый

class ProcessTask implements Runnable {

        private DataItem item;

        ProcessTask(DataItem item) {
            this.item = item;
        }
        @Override
        public void run(){
            saveItem(item);
        }
    }

Основная функция будет вызывать следующее:

static final DataItem[] dataList2 = {
        new DataItem(10000, 1, 100),
        new DataItem(10001, 1, 50),
        new DataItem(10000, 2, 200),
        new DataItem(10001, 2, 51),
        new DataItem(10000, 3, 300),
        new DataItem(10001, 3, 52),
        new DataItem(10000, 4, 400),
        new DataItem(10001, 4, 53)
    };

static void test1() {
        long start = System.currentTimeMillis();
        System.out.println("====== Test 1 ======");;
        FeedProcessor processor = new FeedProcessor();
        for(DataItem item : dataList1) {
            processor.add(item);
        }
        processor.shutdown();
        System.out.println("Test 1 took " + (System.currentTimeMillis()-start));
    }

В настоящее время результаты не в порядке возрастания их версий, это цель.

...