Изоляция потока в Java

Я нахожу Marlett (шрифт встроенный в Windows) удобный для такой вещи.

<Button FontFamily="Marlett" FontSize="20" Content="5"/>
<Button FontFamily="Marlett" FontSize="20" Content="6"/>
5
задан informatik01 31 July 2018 в 08:06
поделиться

7 ответов

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

Вы можете использовать некоторые уловки с загрузчиками классов, но это ведет к совершенно новому сложному миру. Чтобы уточнить, можно загрузить один и тот же класс дважды (или более раз) в одну и ту же JVM, если вы используете разные загрузчики классов - следовательно, вы можете эффективно получать независимые копии статических переменных. Это использование отдельных загрузчиков классов эксплуатируется некоторыми серверами приложений Java EE. Это, в свою очередь, приводит к вопросам о том, какой загрузчик классов и путь к классам используются, когда сами библиотеки начинают выполнять некоторую рефлексию и динамическую загрузку классов. Я бы не рекомендовал этот подход, если только ваша потребность не очень велика.

По предпочтениям будет:

1). Используйте однопоточный воркер для небезопасного кода. Постарайтесь выполнять как можно больше работы в многопоточном приложении, как можно меньше погружаясь в Worker.

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

3). Если вы не можете позволить себе накладные расходы IPC , попробуйте найти поточно-ориентированную альтернативу библиотекам или, если у вас есть влияние на авторов, попросите их исправить код. На самом деле, не должно быть так сложно увеличить их параллелизм.

Постарайтесь выполнять как можно больше работы в многопоточном приложении, как можно меньше погружаясь в Worker.

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

3). Если вы не можете позволить себе накладные расходы IPC , попробуйте найти поточно-ориентированную альтернативу библиотекам или, если у вас есть влияние на авторов, попросите их исправить код. На самом деле, не должно быть так сложно увеличить их параллелизм.

Постарайтесь выполнять как можно больше работы в многопоточном приложении, как можно меньше погружаясь в Worker.

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

3). Если вы не можете позволить себе накладные расходы IPC , попробуйте найти поточно-ориентированную альтернативу библиотекам или, если у вас есть влияние на авторов, попросите их исправить код. На самом деле, не должно быть так сложно увеличить их параллелизм.

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

3). Если вы не можете позволить себе накладные расходы IPC , попробуйте найти поточно-ориентированную альтернативу библиотекам или, если у вас есть влияние на авторов, попросите их исправить код. На самом деле, не должно быть так сложно увеличить их параллелизм.

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

3). Если вы не можете позволить себе накладные расходы IPC , попробуйте найти поточно-ориентированную альтернативу библиотекам или, если у вас есть влияние на авторов, попросите их исправить код. На самом деле, не должно быть так уж сложно увеличить их параллелизм.

11
ответ дан 18 December 2019 в 09:51
поделиться

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

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

а также препятствует моей способности убить целевой процесс

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

См. Также этот вопрос для обсуждения подобной проблемы.

4
ответ дан 18 December 2019 в 09:51
поделиться

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

Может быть, вы можете обернуть доступ к общим ресурсам таким образом, чтобы вы могли синхронизировать доступ?

0
ответ дан 18 December 2019 в 09:51
поделиться

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

0
ответ дан 18 December 2019 в 09:51
поделиться

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

Судя по всему, код, который вы пытаетесь использовать повторно, на самом деле не предназначен для использования в многопоточном приложении. В этом случае лучшим вариантом может быть запуск отдельного процесса для каждого экземпляра. Вместо того, чтобы препятствовать вашей способности убивать каждый экземпляр, это должно облегчить задачу; см. Process.destroy () .

Хотя неясно, что вы подразумеваете под «в реальном времени», если каждый дочерний процесс записывает в свой стандартный вывод, вы можете закодировать свою управляющую программу для чтения и сопоставлять вывод, как он написан.

0
ответ дан 18 December 2019 в 09:51
поделиться

Вы можете попробовать разместить ресурсы в одном исполнителе таким образом, чтобы у вас никогда не было двух из этих процессов, работающих параллельно.

Вы можете сделать это с помощью Исполнители:

class Foo {
  private ExecutorService executor = Executors.newSingleThreadExecutor();

  public void addTask(Runnable bar) {
    executor.submit(bar);
  }
}
0
ответ дан 18 December 2019 в 09:51
поделиться

Ваши требования покрываются JSR-121 , утвержденным в 2006 году.

Я мало что слышал о реализациях JSR-121, но быстрый поиск привел меня к http://weblogs.java.net/blog/gczaj/archive/j2se/index.html .

2
ответ дан 18 December 2019 в 09:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: