Рекурсивная многопоточность с JFrame - PullRequest
0 голосов
/ 30 октября 2018

Я огляделся, но не нашел ничего достаточно конкретного, чтобы ответить на мой вопрос. Суть в том, что я пытался реализовать алгоритмы визуальной сортировки, используя jFrame java. Из-за проблем с перерисовкой, которые не работают в функциях / циклах, я переключился на Google и переключился на Threading. Моя текущая проблема заключается в том, что реализация рекурсивных алгоритмов является серьезной проблемой, поскольку потоки мешают друг другу. С моим профессором мне удалось получить решение с помощью .join (), но теперь у меня проблемы с перекрашиванием. Сортировка заканчивается до того, как произойдет перекраска. Общий консенсус заключается в том, что происходит слишком много вызовов repaint (), и это все портит. Кто-нибудь может мне с этим помочь? Я отлично меняю свою программу, поэтому не использую многопоточность, но я бы хотел сохранить сортировку без изменений.

Сортировка (MergeSort):

     public void MergeSort(Point array[], int start, int end) {
            if (start == end) {
                return;
            }
            else {
                int mid = (end + start) / 2;



            Thread t1 = new Thread() {
                public void run() {
                    MergeSort(array, start, mid);
                    repaint();
                }
            };

            Thread t2 = new Thread() {
                public void run() {
                        MergeSort(array, mid + 1, end);
                        repaint();
                }
            };

            t1.start();
            t2.start();

            try {
                t1.join();
                t2.join();
            } 
            catch (InterruptedException e) {
            }

            int temp[] = new int[array.length];
            for(int i = 0; i < temp.length; i++) {
                temp[i] = 0;
            }

            int i = 0;

            int x = start;
            int y = mid + 1;

            while (x <= mid && y <= end) {
                if (array[x].y <= array[y].y) {
                    temp[i] = array[x].y;
                    x++;
                    i++;
                }
                else {
                    temp[i] = array[y].y;
                    y++;
                    i++;
                }
            }

            while (x <= mid) {
                temp[i] = array[x].y;
                x++;
                i++;
            }

            while (y <= end) {
                temp[i] = array[y].y;
                y++;
                i++;
            }

            i = start;
            for(int k = 0; k < end - start + 1; k++) {
                array[i].y = temp[k];
                try {
                    TimeUnit.MILLISECONDS.sleep(5);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                repaint();
                i++;
            }
        }
    }

Он вызывается через JButton:

JButton merge = new JButton("Merge");
    merge.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            if (ThreadFinished) {
                populatePoints(array);
                MergeSort(array, 0, array.length - 1);
                repaint();
            }
        }
    });
    add(merge);
...