Запуск нескольких потоков на нескольких JPanels и переключение их

1

У меня есть TCP-сервер с многопоточным и может обрабатывать его из cli.

Теперь я хочу написать для него графический интерфейс, чтобы я мог легко запускать, наблюдать, управлять и закрывать конкретные экземпляры этого многопоточного сервера. Сначала я подумал о JTable, и это также мой первый вопрос:

Является ли это хорошим способом (или даже возможным) для обработки нескольких серверных файлов в нескольких сокетах (а не в потоках) внутри JTable, и могу ли я отправлять им данные для обновления отдельных строк в зависимости от socketactivities? Я имею в виду, что когда каждая строка обозначает текущее значение serverthread, пользователь должен иметь возможность щелкнуть по нему, запустить новый (который будет добавлен в список), см. Файл socketstatus (независимо от того, что будет) в поле, посмотреть, сколько клиенты подключены и даже смогут остановить определенный поток в этой таблице?

Мой второй вопрос:

Когда я начинаю внедрять его так, как я описал выше, что происходит с jtable и текущими потоками, когда я обновляю активный JPanel другим интерфейсом и снова переключаюсь? Например, у меня есть один интерфейс для обзора обо всех экземплярах, а другой - для подробностей об одном его экземпляре. Будут ли прерваны все потоки или они могут снова связаться с таблицей? Или лучше использовать cardLayout?

Когда я меняю карточку на карту, и на этой карте что-то работает (например, JTable с запущенными сокетами), они будут прерваны или остановлены или я могу обновить статус-данные в JTable? Таким образом, сокеты должны иметь возможность записывать и обновлять данные в таблицу по всем.

И теперь мой последний вопрос, спасибо за чтение так долго. пытаясь найти ответы на все мои вопросы выше, я попробовал простой кадр переключения JPanel с JTextarea на каждой панели, который пишет 100 строк с перерывом в 1000мс между ними. Затем я хотел переключить панели и посмотреть, была ли эта задача прервана. К сожалению, я даже не могу заставить это работать.

Во внешнем классе MyPanel я запускаю JPanel с индивидуальной конфигурацией и добавляю его в основной фрейм.

Цикл for предназначен только для тестирования:

class MyPanel extends JPanel {

public static JTextArea tArea;

  public MyPanel(String config) {

    JButton testButton = new JButton(config);
    add(testButton);

    tArea = new JTextArea();    
    JScrollPane scroll = new JScrollPane(tArea);
    add(scroll, BorderLayout.CENTER);  

    for (int i = 0 ; i < 50 ; i ++ ) {
        tArea.append("test \n") ;
        try { Thread.sleep(2000); } catch(InterruptedException ie) {}
    }

    setVisible(true);
    revalidate();
    repaint();

  }

}

Но я думаю, что это совершенно неправильно, потому что я называю это перед повторной обработкой и перерисовкой :( И внутри мэйнфрейма я хочу инициировать его таким образом:

JMenuItem menuItem = new JMenuItem("Test");
menuItem.addActionListener(new ActionListener() {
  @Override
  public void actionPerformed(ActionEvent event) {
    MyPanel dynamicPanel = new MyPanel("Test");
    contentContainer.removeAll();
    contentContainer.add(dynamicPanel);
    contentContainer.revalidate();
    contentContainer.repaint();
  }
});
  • 0
    Первое, что вам нужно знать, Swing - это однопоточный фреймворк, который НЕ является потокобезопасным. Это означает, что все обновления и взаимодействия с пользовательским интерфейсом ДОЛЖНЫ осуществляться из потока пользовательского интерфейса (потока диспетчеризации событий), см. Параллелизм в Swing.
Теги:
multithreading
swing

1 ответ

2

Первое, что вам нужно знать, Swing - это однопоточная инфраструктура и не является потокобезопасной. Это означает, что все обновления и взаимодействия с пользовательским интерфейсом ДОЛЖНЫ быть сделаны из потока пользовательского интерфейса (Event Dispatching Thread), см. Раздел Параллельность в Swing

это хороший способ (или даже возможный) для обработки нескольких серверных файлов в нескольких сокетах (а не в потоках) внутри JTable, и могу ли я отправлять ему данные для обновления отдельных строк в зависимости от socketactivities? я имею в виду, что когда каждая строка обозначает текущее значение serverthread, пользователь должен иметь возможность щелкнуть по нему, запустить новый (который будет добавлен в список), см. файл socketstatus (независимо от того, что будет) в поле, посмотреть, сколько клиенты подключены и даже смогут остановить определенный поток в этой таблице?

Честно говоря, я не думаю, что это важно, проблема заключается в получении информации из ваших потоков/сокетов в пользовательский интерфейс. Я бы подумал о том, что у меня есть Thread, единственная цель которого - опросить все остальные потоки/сокеты для информации, а затем синхронизировать эту информацию с пользовательским интерфейсом, следя за тем, чтобы не нарушать правила нити Swing в этом процессе. SwingWorker может быть хорошим выбором здесь, в зависимости от вашего дизайна.

Причина, по которой я бы не стал рассматривать каждый поток, отправляющий информацию в пользовательский интерфейс индивидуально, заключается в том, что это было бы действительно хорошим способом подавить EDT и заставить его отставать, в то время как он пытался обработать обширное количество данных, которые могла бы создать ваша система

когда я начну реализовывать его так, как я описал выше, что происходит с jtable и текущими потоками, когда я обновляю активный JPanel другим интерфейсом и снова переключаюсь? например, у меня есть один интерфейс для обзора всех экземпляров, а другой - для подробностей об одном его экземпляре. будут ли все потоки прерваны или они смогут снова связаться с таблицей? или лучше использовать cardLayout?

когда я меняю карту на карточке и на этой карте что-то работает (например, JTable с запущенными сокетами), они будут прерваны или остановлены или я могу обновить статус-данные в JTable? поэтому сокеты должны иметь возможность записывать и обновлять данные в таблицу по всем.

Основываясь на описании, которое я дал выше, по существу ничего не произойдет с потоками, которые вы используете в фоновом режиме, потому что они отключены от пользовательского интерфейса. Поток "опроса" все еще будет запущен и будет по-прежнему отправлять обновления в таблицу (надеюсь, через TableModel), но, поскольку он на самом деле не отображается на экране, он не будет окрашиваться и "не должен" отрицательно влиять производительность системы.

Это порождает идею какой-то "государственной" модели. Эта модель действительно может использоваться для описания состояния отдельного потока, тогда это может управляться "государственным" менеджером, который дает вам доступ к этой информации (а также к фактическому потоку). В потоке опроса будет получена информация из текущего потока/сокета и обновлена соответствующая модель состояния для этого потока, это означает, что вы можете повесить весь свой пользовательский интерфейс и знать, что пока вы обращаетесь к нему, он только когда-либо был изменен изнутри контекст EDT - отсутствие мертвых условий блокировки или гонки. Как идея

И теперь мой последний вопрос, спасибо за чтение так долго. пытаясь найти ответы на все мои вопросы выше, я попробовал простой кадр переключения JPanel с JTextarea на каждой панели, который пишет 100 строк с перерывом в 1000мс между ними. то я хотел переключить панели и посмотреть, была ли эта задача прервана. черт возьми, я такой noob, я даже не могу заставить это работать.

Во внешнем классе MyPanel я запускаю JPanel с индивидуальной конфигурацией и добавляю его в основной фрейм.

Это потому, что ваш код блокирует поток Dispatching Event, который отвечает за обработку очереди событий, которая также переносит события перерисовки (между прочим), это означает, что во время работы цикла пользовательский интерфейс не может быть обновлен (или взаимодействует с).

Код лучше будет обслуживать SwingWorker.

См. " Параллельность" в Swing and Worker Threads и SwingWorker для получения более подробной информации.

  • 0
    спасибо, что я прочитал это сейчас около 2 часов, но я не знаю, как справиться с этим в моем случае. Вы можете показать мне работающий код или это слишком много кода? В любом случае спасибо за ваше длинное и подробное объяснение.
  • 0
    Это не на 100% то же самое, но что-то вроде этого, на котором запущено несколько Thread которые обновляют таблицу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню