Общие переменные в потоках Java

Мне нужно 3 параметра для запуска моего метода. Два из них должны быть частью общей матрицы (две ее строки), а последняя является главной для индекса. Как я могу передать их в мой метод? У меня довольно большая матрица, так что, возможно, не лучшая идея дублировать переменные в разных местах ... Должен ли я создать еще один класс с этими атрибутами и заставить этот класс реализовывать Runnable?

контроль ArrayList предназначен для работы в качестве места, где можно увидеть, не совпадает ли столбец, в котором я работаю, со столбцом в строке выше, поскольку он не даст правильный ответ.

Как я могу сохранить их на максимуме, определяемом потоками, и не останавливать мой основной поток? Насколько я знаю, присоединение к потоку остановит мой mainThread.

Мой код выглядит так:

public class MochilaCeroUno extends Thread {
    protected List<Item> itemList = new ArrayList<Item>();
    protected int maxWeight = 0;
    protected int solutionWeight = 0;
    protected int profit = 0;
    protected boolean calculated = false;
    static int threads;
    static List<MyPair> control;

Метод запуска:

public void run(List<Integer> filaAnterior, List<Integer> filaActual, int i) {

        MyPair pair = new MyPair(i, 0);
        control.set((i - 1) % threads, pair);
        int numFilaAnterior = i - 1;

        if (numFilaAnterior >= 0) {
            for (int j = 0; j <= maxWeight; j++) {  //Posar concurrencia aqui
                if (control.get((numFilaAnterior - 1) % threads).getCol() > j) {
                    if (j > 0) {
                        int wH = itemList.get(i - 1).getWeight();
                        if (wH > j) {
                            filaActual.add(filaAnterior.get(j));
                        } else {
                            filaActual.add(Math.max(filaAnterior.get(j), itemList.get(i - 1).getValue() + filaAnterior.get(j - wH)));
                        }
                    } else {
                        filaActual.add(0);
                    }
                } else {
                    j--;
                    yield();
                }
            }
            super.run();
        }
    }

Метод, который вызывает запуск и должен создавать потоки:

public List<Item> calcSolution() {
    int n = itemList.size();

    setInitialStateForCalculation();
    if (n > 0 && maxWeight > 0) {
        List<List<Integer>> c = new ArrayList<List<Integer>>();
        List<Integer> curr = new ArrayList<Integer>();


        c.add(curr);
        for (int j = 0; j <= maxWeight; j++) {
            curr.add(0);
        }

        for (int i = 1; i <= n; i++) {
            List<Integer> prev = curr;
            c.add(curr = new ArrayList<Integer>());
            new MochilaCeroUno().start();
           ...
Должен ли я создать еще один класс с этими атрибутами и заставить этот класс реализовывать Runnable? Да. И, пожалуйста, используйте поточно-ориентированную версию List. stackoverflow.com/questions/8203864/…
xingbin 31.10.2018 04:03

Единственный потокобезопасный список должен быть списком управления, верно? Я новичок в использовании потоков и java ...

Jo4nP4l4u 31.10.2018 04:12
filaActual должен быть потокобезопасным, поскольку вы добавляете к нему элементы в нескольких потоках.
xingbin 31.10.2018 04:13

Возможно, вам лучше преобразовать этот код для использования новой абстракции Streams в Java 8 (?), А затем позволить ему распараллелить работу для вас, но я не знаю, что вы пытаетесь вычислить здесь, поэтому я не знаю, насколько это возможно это преобразование будет ...

moilejter 31.10.2018 04:13

Я пытаюсь решить проблему с рюкзаком, используя нити "по диагонали". Таким образом, previousRow не может быть равен фактической строке или меньше нее.

Jo4nP4l4u 31.10.2018 04:17

filaActual - это строка, в которой только один поток вставляет элементы в позицию p, но другой может читать массив до p-1. Должен ли он быть потокобезопасным?

Jo4nP4l4u 31.10.2018 04:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
73
0

Другие вопросы по теме