как запустить 2 потока в JFrame

Привет, у меня возникла следующая проблема... У меня основной jframe начался так:

public static void main (String args[]){
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            Form3 myF=new Form3();                    
        }
    });
};

в jframe у меня есть Jpanels. На jpanel я хочу начать второй поток. Я пробовал это так:

try {
    while (DBAccess.haveResult("ASS"+harnessId)==null&&cancelCycle == 0) {

        thread1.sleep(3*1000);
        System.out.println("+++++++++");
        System.out.println(DBAccess.haveResult("ASS"+harnessId));
        res = DBAccess.haveResult("ASS"+harnessId);

    }

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

но я не могу остановить этот поток и даже не могу его отменить, потому что главное окно перестает реагировать

чтобы прояснить мою проблему: у меня есть кнопка «Тест» на JPanel, которая запускает процесс тестирования. Процесс тестирования состоит из цикла, который повторяется каждые 3 секунды, этот цикл проверяет состояние базы данных. Проблема в том, что я не могу остановить этот цикл, пока статус не появится в БД (условие пока), потому что окно занято после того, как я нажму «тест». Даже реализация runnable и помещение тестового метода в run() не сработали.

Исходный код тестовой кнопки:

if (e.getActionCommand().equals("Test")){
            run();}

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

@Override
    public final void run() {
        test();
    }

Метод испытания:

Map result_row =  DBAccess.addRow("ASS"+harnessId,htOperList.get(seqNumber-1).getNametestprogram(),"",null);
                if(result_row.containsKey("ADDROW")){System.out.println("Record inserted" );}
                Database db = null;
                Map res = null;                
                try {
                    while (DBAccess.haveResult("ASS"+harnessId)==null&&cancelCycle == 0) {

                        thread1.sleep(3*1000);                        
                        System.out.println(DBAccess.haveResult("ASS"+harnessId));
                        res = DBAccess.haveResult("ASS"+harnessId);
                    }

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

person Michael    schedule 20.08.2013    source источник
comment
Если окно перестает реагировать, это означает, что цикл выполняется не в отдельном потоке, а в потоке отправки событий, что приводит к зависанию пользовательского интерфейса. Покажите нам, как вы объявляете, инициализируете и запускаете свой поток.   -  person JB Nizet    schedule 20.08.2013
comment
добавлен больше исходного кода   -  person Michael    schedule 20.08.2013
comment
Вы не запускаете поток, вызывая метод run() Runnable. Это просто вызывает метод в текущем потоке. Прочтите руководство по параллелизму.   -  person JB Nizet    schedule 20.08.2013
comment
@Michael: Пожалуйста, взгляните на StartStopPause.java, это может дать у вас слабое представление о том, как это сделать, хотя, как указано в ответе, SwingWorker намного лучше, поскольку программисту не нужно беспокоиться об обновлениях, связанных с графическим интерфейсом, поскольку они автоматически выполняются на EDT :-)   -  person nIcE cOw    schedule 20.08.2013


Ответы (1)


Вы блокируете поток отправки событий. Используйте SwingWorker для тяжелых задач. Поместите основную операцию БД в doInBackround() и используйте publish() для промежуточных результатов.

Если вам нужно остановить его до завершения doInBackround(), вы можете использовать cancel(). См. здесь заметки об этом.

person kiheru    schedule 20.08.2013