Реализация потока в Java из фона C # - PullRequest
4 голосов
/ 26 января 2011

Я пытаюсь реализовать многопоточность в своем Java-приложении с графическим интерфейсом, чтобы освободить интерфейс при запуске нескольких интенсивных методов.Я в основном из среды разработки на C # и пару раз использовал Threads в этой среде, не особо задумываясь об этом.

Примерно:

C #

  • Создать объект потока
  • Назначить ему метод для запуска с
  • Начать поток

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

Есть три конкретные операции, которые я хочу выполнить в их собственном потоке

  1. Воспроизведение сохраненных нот MIDI
  2. Отображение списка инструментов с помощью текстового поля
  3. Создание 100 случайных нот

У меня есть класс с именемMIDIControl, который содержит все необходимые функции, такие как фактические операции для воспроизведения, остановки и генерирования нужных мне сообщений.Существует экземпляр этого объекта, созданный в классе FooView.Java для самой формы GUI, это означает, например:

  1. Нажмите «Generate»
  2. Обработчик событий выполняет «GenerateNotes»"метод в классе FooView.Java
  3. Этот метод затем выполняет метод" Generate "в экземпляре MIDIControl

Я смотрел на реализацию потоков через Java и из того, что я 'я видел, что это делается не так, как метод C #, кто-нибудь может мне объяснить, как я могу реализовать потоки в моей ситуации?

Я могу предоставить примеры кода, если необходимо, спасибо за ваше время.

Ответы [ 5 ]

6 голосов
/ 26 января 2011

Потоки Java создаются так же, как потоки C #, за исключением того, что вы передаете потоку реализацию Runnable вместо делегата.(Поскольку Java не поддерживает делегатов)

3 голосов
/ 26 января 2011

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

2 голосов
/ 27 января 2011

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

Если вашей задаче необходимо обновить элементы графического интерфейса, такие как ваша задача (2), вам потребуется подкласс SwingWorker.Код обработки (звонки в вашу существующую библиотеку) входит в ваше переопределение doInBackground(), отправляя любые данные через publish().Затем переопределение SwingWorker process() может взаимодействовать с вашими компонентами Swing.

Причина: Swing не является поточно-ориентированным, поэтому он потенциально может сломаться при доступе из потоков, отличных от Thread Dispatch Thread (EDT).process() будет выполняться в EDT.

Для задач, которые не обновляют графический интерфейс, создайте новый класс, который реализует Runnable, и вставьте соответствующий код вызова библиотеки MIDI в метод run().Затем вы можете передать это как цель новому потоку, как в new Thread(myRunnable).start().

2 голосов
/ 26 января 2011

Фоновые задачи в приложениях Java с графическим интерфейсом часто выполняются с использованием класса SwingWorker , специально разработанного для этой цели.

1 голос
/ 26 января 2011

Как и другие говорят, что вам нужен класс SwingWorker, это позволит компоненту Swing запустить задачу в другом потоке и получить уведомление о ее завершении и прогрессе в поточно-безопасном режиме.Вы не можете просто изрезать случайные потоки, используя необработанные объекты, которые могут быть запущены, а затем ожидать взаимодействия со свингом через эти потоки;Конструкция Swing не является поточно-ориентированной, поэтому, поступая таким образом, вы почти наверняка внесете в свой код незначительные ошибки в потоке.

В зависимости от используемой версии Java, вы можете либо загрузить SwingWorker отдельно, либоиспользуйте тот, который встроен в API.

Если вы используете Java 6 (или выше), то Swing Worker находится в основном API здесь .

Если вы 'Если вы используете Java 5, то версия Java 6 была перенесена сюда здесь .

Если вы используете более раннюю версию, вам придется добавить оригинальную версию Sun, в которой будет здесь .

...