2011-09-16 3 views
0

Я пытаюсь сделать так, что, когда я нажимаю кнопку, программа запускает метод в новом потоке. Проблема в том, что когда я нажимаю кнопку, программа зависает до тех пор, пока метод не будет запущен, как будто я вообще не использовал нить. кто-нибудь знает, как решить эту проблему?проблема с потоком JAVA

Спасибо Morgan.

public Listeners() 
{ 
    Calendar.ButtonAddReminder.addActionListener(new ButtonAddListener()); 
} 

private class ButtonAddListener implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) { 
     new Thread(Calendar.reminder.Reminderchecker(Calendar.reminder.addReminder(date, str))) .start(); 
    } 
} 

ответ

4

От того, это выглядит как-то в Calendar.reminder.addReminder() или Calendar.reminder.Reminderchecker() занимает некоторое время и блокировку пользовательского интерфейса, так что то, что происходит в EDT.

Редактировать: О, я вижу. Вы не делаете то, что думаете, что делаете. Вы выполняете Reminderchecker в текущем потоке. Возвращаемый этим методом Runnable - это то, что выполняется в новом потоке. Для запуска Reminderchecker в потоке, сделать что-то вроде:

new Thread(new Runnable() { 
    public void run() { 
     Calendar.reminder.Reminderchecker(...); 
    } 
}).start(); 

Better: Не порождать свои собственные случайные темы, как это. Используйте организованную стратегию параллелизма, например, предоставляемую ExecutorService. Класс Executors позволяет легко создавать несколько, которые охватывают общие области использования.

Еще лучше: ознакомьтесь с SwingWorker и его API docs.

+0

Да, Reminderchecker принимает время для запуска, вот почему я хочу, чтобы запустить новый поток без блокировки системы. Можно ли сделать это? – warbio

+1

@Morgan: попробуйте использовать поток SwingWorker для этого. –

+0

@Morgan: Обновлен мой ответ –

1

Вы должны убедиться, что все это происходит в новом потоке:

Calendar.reminder.Reminderchecker(Calendar.reminder.addReminder(date, str)) 

В настоящее время

Calendar.reminder.addReminder(date, str) 

и

Calendar.reminder.Reminderchecker() 

называются на Event Диспетчерская тему до создания и запуска нового Thread.

Самый простой способ исправить это - создать новый объект Runnable, который выполняет все эти шаги, а затем передать его новому потоку. Я предполагаю, что возвращаемый объект из Reminderchecker() сам по себе является Runnable, в этом случае вам нужно что-то вроде этого:

Runnable task = new Runnable() { 
    public void run() { 
     Runnable r = Calendar.reminder.Reminderchecker(Calendar.reminder.addReminder(date, str)); 
     r.run(); 
    }; 
new Thread(task).start(); 
1

Если предположить, что ваш Calendar класса реализует Runnable или расширяет Thread вы не должны вызывать Calendar.reminder.Reminderchecker(Calendar.reminder.addReminder(date, str)) перед началом новой темы так как это вызывает метод run() нового потока.

Вместо сделать что-то вроде этого:

public class Calendar implements Runnable { 
    public void run() { 
     this.reminder.Reminderchecker(Calendar.reminder.addReminder(date, str)); 
    }  
} 
Смежные вопросы