2016-05-03 2 views
0

Я должен создать 2 темы. Один читает из данных из файла и создает объекты класса Merchandise. Сам файл состоит из более чем 10000 строк:Получение данных, созданных в одном потоке с другим потоком

IdOfMerchandise Weight 

Первого поток создает объекты Товарной линию и каждые 200 объектов, он пишет об этом. Проблема в том, что мне нужен второй поток, работающий в то же время, что и первый, получая эти объекты и суммируя общий вес, записывая отчет каждые 100.

Как я могу использовать поток для получения данных объекта одновременно с созданием в другом потоке? Использует ли HashMap хорошую идею для хранения вновь созданных объектов класса с двумя переменными?

+1

Статические переменные - это один из вариантов. Вместо использования HashMap ConcurrentHashMap – style

+1

Итак, вы хотите, чтобы моя учетная запись PayPal, чтобы вы могли заплатить мне, чтобы написать этот код для вас? –

+0

Похоже, вам нужно прочитать, как делать межпоточную связь. – tnw

ответ

0

Похоже на проблему производителя-потребителя. Эта официальная ссылка поможет вам понять и реализовать концепцию.

Guarded Blocks

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

+1

Я бы держался подальше от «Охранных блоков» по ​​двум причинам. (1) Вся вещь wait()/notify() - это просто бесконечный источник путаницы для Java noobs. Я знаю, что весь смысл учебника заключается в том, чтобы помочь им понять это, но ... (2) Если вы нооб, и вы думаете, что вам нужен защищенный блок, тогда есть хорошие шансы, что вы повторно изобретаете то, что библиотека дает вам бесплатно. Например, в этом случае «BlockingQueue». –

1

Когда вы передаете данные из одного потока в другой поток, вам нужна структура данных thread-safe. Как вы правильно указали, HashMap не является потокобезопасным. Для потокобезопасных коллекций в Java просмотрите пакет java.util.concurrent. Один из простейших способов реализации шаблонов производителя-потребителя - LinkedBlockingQueue.

Вот полный пример с двумя потоками, один выпускающих объектов, другой трудоемкий и печать что-то каждые 100 объектов:

AtomicBoolean finished = new AtomicBoolean(false); 
LinkedBlockingQueue<String> queue = new LinkedBlockingQueue<>(); 

Thread thread1 = new Thread(() -> { 
    for (int i = 0; i < 10000; i++) { 
     String createdObject = Integer.toString(i); 
     queue.offer(createdObject); 
    } 
    finished.set(true); 
}); 

Thread thread2 = new Thread(() -> { 
    int count = 0; 
    while (!finished.get() || !queue.isEmpty()) { 
     try { 
      String object = queue.poll(100, TimeUnit.MILLISECONDS); 
      if (count++ % 100 == 0) { 
       System.out.println(object); 
      } 
     } catch (InterruptedException e) { 
      throw new RuntimeException(e); 
     } 
    } 
}); 

thread1.run(); thread2.run(); 
thread1.join(); thread2.join(); 

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

Смежные вопросы