Никто не предоставил « классическое решение 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
Изучите новые средства параллелизма 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 имеет больше информации также.
Лучшая подсказка должна быть: получают Вашу корректную синхронизацию!
Это может казаться несколько очевидным, но понимание Модель памяти Java жизненно важна, особенно как энергозависимый и финал полевая работа, как синхронизировался действия и как взаимное исключение и как барьер памяти и затем новое java.util.concurrent
конструкции также
Всегда хороший совет - если большинство Ваших классов неизменно, все становится настолько легче, поскольку неизменность устраняет необходимость волноваться о блокировках от многих до немногих мест беспокойства.
Проверьте приближение платформа соединения ветвления . Платформа соединения ветвления позволяет разработчикам достигнуть мелкомодульного параллелизма на многоядерной архитектуре.
Также можно хотеть проверить основанные на JVM языки как Clojure, которые утверждают, что сделали многоядерное параллельное программирование легче.
Как альтернатива собственной общей памяти Java приближаются к параллелизму, который Вы могли также изучить Основанный на агенте параллелизм с помощью Scala сверху Java, который предоставляет более легкую модель для параллельного программирования.
Проверьте разговор Brian Goetz От параллельного, чтобы быть Параллельными от Devoxx 2008. Не много подсказок там, но это дает Вам общее представление, куда параллелизм Java направляется в.
Лучшая книга с практическими подсказками была Параллелизм Java в Практике . Это - необходимость чтение для всех программистов Java, даже те, кто думает, что они не делают никакого параллельного программирования, потому что Java имеет многих скрытая поточная обработка в ее различных библиотеках (колебание приходит на ум, то же с сервлетами).
Моя подсказка: Поймите Модель памяти Java (начиная с JDK 5 и выше). Большинство людей не знает, та синхронизация, энергозависимый, и окончательный имеют дополнительное значение вне нормального объема многопоточности.
Java хорошо для мульти-CPU и мультиядер. Если Вы программируете его право, и Вы инвестируете некоторый мозг, Вы заставляете очень параллельную систему сервера использовать 8 ядер включая большую синхронизацию и так далее. Мы довольно довольны им... JDK6 лучше, чем JDK5, и все ниже сосет на машинах мульти-CPU.
Вы можете попробовать использовать библиотеку шаблонов параллелизма, такую как Skandium для Java. Просто выберите нужный шаблон параллелизма и заполните недостающие крючки.
Некоторые из шаблонов, поддерживаемых в Skandium:
Ферма (вложенный);
For (nested, i);
While (nested, condition) ;
If (condition, trueCase, falseCase);
Map (разделить, вложить, объединить);
Fork (разделить, вложить, объединить);
DaC (условие, разделение, вложенное, merge);
Все шаблоны можно вкладывать и комбинировать,