Подсказки кодирования программ Java в многоядерном [закрытом] сценарии

Никто не предоставил « классическое решение Reflection », так что вот полный пример кода:

using System;
using System.Collections;
using System.Collections.Generic;

namespace DictionaryRuntime
{
    public class DynamicDictionaryFactory
    {
        /// <summary>
        /// Factory to create dynamically a generic Dictionary.
        /// </summary>
        public IDictionary CreateDynamicGenericInstance(Type keyType, Type valueType)
        {
            //Creating the Dictionary.
            Type typeDict = typeof(Dictionary<,>);

            //Creating KeyValue Type for Dictionary.
            Type[] typeArgs = { keyType, valueType };

            //Passing the Type and create Dictionary Type.
            Type genericType = typeDict.MakeGenericType(typeArgs);

            //Creating Instance for Dictionary<K,T>.
            IDictionary d = Activator.CreateInstance(genericType) as IDictionary;

            return d;

        }
    }
}

Выше DynamicDictionaryFactory класс имеет метод

CreateDynamicGenericInstance(Type keyType, Type valueType)

, и он создает и возвращает экземпляр IDictionary, типы ключей и значений которых точно указаны в запросе keyType и valueType.

Вот полный пример того, как вызвать этот метод для создания экземпляра и использования Dictionary<String, int>:

using System;
using System.Collections.Generic;

namespace DynamicDictionary
{
    class Test
    {
        static void Main(string[] args)
        {
            var factory = new DictionaryRuntime.DynamicDictionaryFactory();
            var dict = factory.CreateDynamicGenericInstance(typeof(String), typeof(int));

            var typedDict = dict as Dictionary<String, int>;

            if (typedDict != null)
            {
                Console.WriteLine("Dictionary<String, int>");

                typedDict.Add("One", 1);
                typedDict.Add("Two", 2);
                typedDict.Add("Three", 3);

                foreach(var kvp in typedDict)
                {
                    Console.WriteLine("\"" + kvp.Key + "\": " + kvp.Value);
                }
            }
            else
                Console.WriteLine("null");
        }
    }
}

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

Dictionary<String, int>
"One": 1
"Two": 2
"Three": 3
16
задан amit 2 March 2009 в 07:10
поделиться

9 ответов

Изучите новые средства параллелизма Java (в java.util.concurrent пакет ), которые были добавлены в Java 5. Это обеспечивает функциональность, которая является более высокоуровневой, чем регулярный Thread с, которая поможет (и менее подверженный ошибкам) записать параллельные приложения. Урок: Параллелизм из [1 120] Учебные руководства по Java был бы хорошим местом для запуска.

До сих пор, я только использовал ExecutorService , который позволяет, может произвести пулы потоков , к которому новые задачи могут быть переданы в единицах [1 123] Runnable с или Callable с (который может возвращать значения после выполнения как [1 125] Future с и фактический код поточной обработки обрабатываются ExecutorService.

, Например, выполняя некоторое вычисление с помощью пула потоков 2 потоков, и получая результат может быть столь же простым как:

ExecutorService es = Executors.newFixedThreadPool(2);

Future f1 = es.submit(new Callable<Integer>() {
    public Integer call()
    {
        // Do some processing...
        return someInteger;
    }
});

Future f2 = es.submit(new Callable<Integer>() {
    public Integer call()
    {
        // Do some processing...
        return someInteger;
    }
});

Integer firstInteger = f1.get();
Integer secondInteger = f2.get();

В вышеупомянутом (непротестированном) коде, все, о чем я должен волноваться, делает несколько Callable с и submit луг это к ExecutorService и позже, с помощью Future с для получения результата.

выгода, однажды get , метод эти Future называют, если обработка не будет завершена, то программа остановится, пока результат эти Future не сможет быть получен. Так, в этом примере, даже если результат [1 115] доступен прежде f1, будет ожидать программа, пока результат [1 117] не будет доступен.

С точки зрения чтения материала, в моем списке книг для покупки скоро Параллелизм Java на практике Brian Goetz, который подходит часто, когда параллелизм в Java поднят.

страница Concurrency Utilities из документации Java 5 имеет больше информации также.

21
ответ дан 30 November 2019 в 15:52
поделиться

Лучшая подсказка должна быть: получают Вашу корректную синхронизацию!

Это может казаться несколько очевидным, но понимание Модель памяти Java жизненно важна, особенно как энергозависимый и финал полевая работа, как синхронизировался действия и как взаимное исключение и как барьер памяти и затем новое java.util.concurrent конструкции также

8
ответ дан 30 November 2019 в 15:52
поделиться

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

6
ответ дан 30 November 2019 в 15:52
поделиться

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

Также можно хотеть проверить основанные на JVM языки как Clojure, которые утверждают, что сделали многоядерное параллельное программирование легче.

3
ответ дан 30 November 2019 в 15:52
поделиться

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

3
ответ дан 30 November 2019 в 15:52
поделиться

Проверьте разговор Brian Goetz От параллельного, чтобы быть Параллельными от Devoxx 2008. Не много подсказок там, но это дает Вам общее представление, куда параллелизм Java направляется в.

2
ответ дан 30 November 2019 в 15:52
поделиться

Лучшая книга с практическими подсказками была Параллелизм Java в Практике . Это - необходимость чтение для всех программистов Java, даже те, кто думает, что они не делают никакого параллельного программирования, потому что Java имеет многих скрытая поточная обработка в ее различных библиотеках (колебание приходит на ум, то же с сервлетами).

1
ответ дан 30 November 2019 в 15:52
поделиться

Моя подсказка: Поймите Модель памяти Java (начиная с JDK 5 и выше). Большинство людей не знает, та синхронизация, энергозависимый, и окончательный имеют дополнительное значение вне нормального объема многопоточности.

Java хорошо для мульти-CPU и мультиядер. Если Вы программируете его право, и Вы инвестируете некоторый мозг, Вы заставляете очень параллельную систему сервера использовать 8 ядер включая большую синхронизацию и так далее. Мы довольно довольны им... JDK6 лучше, чем JDK5, и все ниже сосет на машинах мульти-CPU.

1
ответ дан 30 November 2019 в 15:52
поделиться

Вы можете попробовать использовать библиотеку шаблонов параллелизма, такую ​​как Skandium для Java. Просто выберите нужный шаблон параллелизма и заполните недостающие крючки.

Некоторые из шаблонов, поддерживаемых в Skandium:

  • Главный-подчиненный: Ферма (вложенный);
  • Конвейер : `Pipe (stage1, stage2);
  • Для итерации: For (nested, i);
  • Условная итерация: While (nested, condition) ;
  • Условное ветвление: If (condition, trueCase, falseCase);
  • Map-reduce: Map (разделить, вложить, объединить);
  • Map-reduce с разными путями кода: Fork (разделить, вложить, объединить);
  • Рекурсивное разделение и владение: DaC (условие, разделение, вложенное, merge);

Все шаблоны можно вкладывать и комбинировать,

2
ответ дан 30 November 2019 в 15:52
поделиться
Другие вопросы по тегам:

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