2011-01-26 2 views
4

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

Грубо:

C#

  • Создать объект Thread
  • Назначают его способ начать с
  • резьб

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

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

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

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

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

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

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

+0

Что именно вы спрашиваете? – SLaks

ответ

6

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

+0

Я понимаю, что Runnable - это интерфейс, так что может быть только одна реализация .run() для каждого класса или я ошибаюсь? –

+1

@Jamie: Правильно. Здесь помогут анонимные внутренние классы. http://www.java2s.com/Code/Java/Threads/Creatingthreadswithinnerclasses.htm – SLaks

+0

А, это то, чего мне не хватало. Я никогда не понимал, что Java не поддерживает делегатов и как я могу иметь несколько экземпляров .run(). Спасибо за информацию! –

3

Java Concurrency in Practice - ваш гид. Pls также взгляните на SwingWorker. Помните, что все изменения, связанные с пользовательским интерфейсом (как модель компонента, так и его свойства), всегда должны выполняться в разделе «Диспетчер событий».

2

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

1

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

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

Если вы используете Java 6 (или выше), то рабочий swing находится в ядре API here.

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

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

2

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

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

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

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