Я огляделся, но не нашел ничего достаточно конкретного, чтобы ответить на мой вопрос.
Суть в том, что я пытался реализовать алгоритмы визуальной сортировки, используя 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);