Обновление потока в нужный момент

59
7

У меня возникли проблемы с тем, что мой поток работает на 100% правильно, поскольку в настоящее время он возвращает мой график, уже отсортированный, даже когда я обновляю поток внутри моего алгоритма сортировки, пока он все еще сортируется. Возможно, есть фрагмент кода, который мне может не хватать, потому что я чувствую, что сейчас у меня есть это.

private class ButtonHandler implements ActionListener
{

public void actionPerformed(ActionEvent e)
{
Object src = e.getSource();
if (src == button1){

int[] array2=array;
for (int i = 1; i < array2.length; i++) {
int thingToInsert = array2[i];

int j = i - 1;
while (j >= 0 && thingToInsert<array2[j]) {
array2[j+1] = array2[j];
j--;
}

array2[j+1] = thingToInsert;
(new UpdateTextFieldThread()).execute();
}

}
}

}

 private class UpdateTextFieldThread extends SwingWorker<Void, Integer> 
{
static final int THREAD_DELAY = 1000;
protected Void doInBackground()
{
ExecutorService service = Executors.newSingleThreadExecuto();
try {
Runnable r = new Runnable() {
@Override
public void run() {
try {
Thread.sleep(THREAD_DELAY);
display.repaint();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
Future<?> f = service.submit(r);

f.get(2, TimeUnit.MINUTES);
}
catch (final InterruptedException e) {
// The thread was interrupted during sleep, wait or join
}
catch (final TimeoutException e) {
// Took too long!
}
catch (final ExecutionException e) {
// An exception from within the Runnable task
}
finally {
service.shutdown();
}
return null;

}

Это то, что я сделал для достижения того, чего хотел.

  private class UpdateTextFieldThread extends SwingWorker<Void, Integer[]> 
{
static final int THREAD_DELAY = 1000;
protected Void doInBackground()
{
if(base==1){
array2=array;
try {

Integer[] array3=array;
for (int i = 1; i < array3.length; i++) {
Thread.sleep(THREAD_DELAY);

int thingToInsert = array3[i];

int j = i - 1;
while (j >= 0 && thingToInsert<array3[j]) {
array3[j+1] = array3[j];
j--;
}

array3[j+1] = thingToInsert;
publish(array3);
}

} catch (InterruptedException e) {
e.printStackTrace();
}
}

return null;
}
protected void process(java.util.List<Integer[]> list)
{
array2=list.get(list.size()-1);

display.repaint();
}
}

спросил(а) 2014-12-02T20:20:00+03:00 6 лет назад
1
Решение
72

Похоже, ты слишком сильно напугаешь это! У вас есть SwingWorker, который выполняется на фоновом потоке; и затем это начало другой собственной нити.

Я думаю, вы хотите, чтобы ваш ActionListener запустил SwingWorker для сортировки, и он может использовать SwingUtilities.invokeLater() чтобы запланировать перерисовку, когда SwingUtilities.invokeLater(). Или также сделайте свои обновления в методе process() и вызовите publish() чтобы вызвать это, чтобы сделать перерисовку.

ответил(а) 2014-12-02T20:26:00+03:00 6 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема