Вопросы о новичке многопоточности Java

Из комментария - не вопрос.

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

ответ на ", это возможный" всегда является "да". Всегда. Если Ваш вопрос не включает путешествие во времени, антигравитационное или вечное движение.

, Так как ответ всегда - "да", Ваш вопрос плохо формируется. Реальный вопрос, "что хороший путь состоит в том, чтобы иметь мой модуль входа, знают имя клиента?" или что-то как этот.

ответ, "Принимают его в качестве параметра". Не бездельничайте с осмотром или поиском таинственного globals или других приемов.

Просто следуют шаблону разработки logging.getLogger () и используют явно названные регистраторы. Общая идиома является следующим

logger= logging.getLogger( __name__ )

, Который обрабатывает почти весь журнал, называющий отлично.

9
задан Carl 7 October 2009 в 17:20
поделиться

3 ответа

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

  • Если что-то только когда-либо читается, это должно быть нормально для чтения несколько потоков. Если вы можете сделать объекты, о которых идет речь, неизменяемыми (чтобы гарантировать , что они никогда не будут изменены), это даже лучше.

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

8
ответ дан 4 December 2019 в 14:29
поделиться

Как некоторые люди сказал, ответы следующие:

  1. Потоки на ядрах - Да. Java уже давно поддерживает собственные потоки. В большинстве операционных систем предусмотрены потоки ядра, которые автоматически распределяются между всеми имеющимися у вас процессорами (производительность реализации может варьироваться в зависимости от ОС).

  2. Простой ответ - в целом это будет безопасно. Более сложный ответ заключается в том, что вы должны убедиться, что ваш объект действительно создан и инициализирован, прежде чем какие-либо потоки смогут получить к нему доступ. Это решается одним из двух способов:

    • Позвольте загрузчику классов решить проблему за вас с помощью Singleton (и отложенной загрузки классов):

       открытый класс MyImmutableObject
      {
       частный статический класс MyImmutableObjectInstance {
       частный статический финальный экземпляр MyImmutableObject = новый MyImmutableObject ();
       }
       public MyImmutableObject getInstance () {
       return MyImmutableObjectInstance.instance;
       }
      }
      
    • Явное использование семантики получения / выпуска для обеспечения согласованной модели памяти:

       MyImmutableObject foo = null;
      volatile bool objectReady = false;
      
      // поток инициализатора:
      ....
      /// создать и инициализировать объект для использования несколькими потоками
      foo = новый MyImmutableObject ();
      foo.initialize ();
      
      // снимаем барьер
      objectReady = true;
      
      // запускаем рабочие потоки
      public void run () {
       // получить барьер
       если (! objectReady)
       выбросить новое исключение IllegalStateException («Нарушение модели памяти»);
      
       // начинаем использовать неизменяемый объект foo
      }
      

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

  3. Как уже упоминалось, существуют всевозможные механизмы RPC. Также существует RMI, который представляет собой собственный подход для запуска кода на удаленных объектах. Также существуют такие платформы, как Hadoop, которые предлагают более полное решение, которое может быть более подходящим.

  4. Для вызова машинного кода это довольно некрасиво - Sun действительно препятствует его использованию, превращая JNI в ужасно сложный беспорядок, но это возможно. Я знаю, что существовала по крайней мере одна коммерческая среда Java для загрузки и выполнения собственных динамических библиотек, не беспокоясь о JNI (не уверен, есть ли бесплатные проекты или проекты OSS).

Удачи.

1
ответ дан 4 December 2019 в 14:29
поделиться

Использование многоядерных процессоров

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

Неизменяемые объекты

Для объектов, доступных только для чтения, объявляйте их поля-члены как final , что гарантирует, что они будут назначены при создании объекта и никогда не будут изменены . Если поле не является final , даже если оно никогда не менялось после создания, в многопоточной программе могут быть некоторые проблемы "видимости". Это может привести к тому, что назначения, сделанные одним потоком, никогда не станут видимыми для другого.

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

Распределенные вычисления

Наиболее широко используемая структура для распределенной обработки такого рода в Java называется Hadoop. Он использует парадигму под названием map-reduce.

Native Code Integration

Интеграция с другими языками вряд ли будет иметь смысл. Благодаря адаптивному преобразованию байт-кода в собственный компилятор Java уже чрезвычайно быстро справляется с широким спектром вычислительных задач. Было бы неправильно предполагать, что другой язык быстрее, без реального тестирования. Кроме того, интеграция с «собственным» кодом с использованием JNI чрезвычайно утомительна, подвержена ошибкам и сложна; использование более простых интерфейсов, таких как JNA, очень медленное и быстро уничтожит любой прирост производительности.

Распределенные вычисления

Наиболее широко используемая среда для распределенной обработки такого рода в Java называется Hadoop. Он использует парадигму под названием map-reduce.

Native Code Integration

Интеграция с другими языками вряд ли будет иметь смысл. Благодаря адаптивному преобразованию байт-кода в собственный компилятор Java уже очень быстро справляется с широким спектром вычислительных задач. Было бы неправильно предполагать, что другой язык быстрее, без реального тестирования. Кроме того, интеграция с «собственным» кодом с использованием JNI чрезвычайно утомительна, подвержена ошибкам и сложна; использование более простых интерфейсов, таких как JNA, очень медленное и быстро уничтожит любой прирост производительности.

Распределенные вычисления

Наиболее широко используемая среда для распределенной обработки такого рода в Java называется Hadoop. Он использует парадигму под названием map-reduce.

Native Code Integration

Интеграция с другими языками вряд ли будет иметь смысл. Благодаря адаптивному преобразованию байт-кода в собственный компилятор Java уже очень быстро справляется с широким спектром вычислительных задач. Было бы неправильно предполагать, что другой язык быстрее, без реального тестирования. Кроме того, интеграция с «собственным» кодом с использованием JNI чрезвычайно утомительна, подвержена ошибкам и сложна; использование более простых интерфейсов, таких как JNA, очень медленное и быстро уничтожит любой прирост производительности.

Интеграция собственного кода

Интеграция с другими языками вряд ли будет иметь смысл. Благодаря адаптивному преобразованию байт-кода в собственный компилятор Java уже очень быстро справляется с широким спектром вычислительных задач. Было бы неправильно предполагать, что другой язык быстрее, без реального тестирования. Кроме того, интеграция с «собственным» кодом с использованием JNI чрезвычайно утомительна, подвержена ошибкам и сложна; использование более простых интерфейсов, таких как JNA, очень медленное и быстро уничтожит любой прирост производительности.

Интеграция собственного кода

Интеграция с другими языками вряд ли будет иметь смысл. Благодаря адаптивному преобразованию байт-кода в собственный компилятор Java уже чрезвычайно быстро справляется с широким спектром вычислительных задач. Было бы неправильно предполагать, что другой язык быстрее, без реального тестирования. Кроме того, интеграция с «собственным» кодом с использованием JNI чрезвычайно утомительна, подвержена ошибкам и сложна; использование более простых интерфейсов, таких как JNA, очень медленное и быстро уничтожит любой прирост производительности.

код с использованием JNI чрезвычайно утомителен, подвержен ошибкам и сложен; использование более простых интерфейсов, таких как JNA, очень медленное и быстро уничтожит любой прирост производительности.

код, использующий JNI, чрезвычайно утомителен, подвержен ошибкам и сложен; использование более простых интерфейсов, таких как JNA, очень медленное и быстро уничтожит любой прирост производительности.

5
ответ дан 4 December 2019 в 14:29
поделиться
Другие вопросы по тегам:

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