package com.javarush.test.level29.lesson05.task01;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ThreadLocalRandom;
/* И еще раз рефакторинг
1. Исправить код в соответствии с Naming and Code Convention (Shift+F6 для рефакторинга)
2. Просмотрите методы класса ConcurrentMap.
3. В строке "String previousEntry = null;" у concurrentMap вызовите метод,
который вставит пару (randomInt, text) только для ключа, которого нет в concurrentMap.
Метод должен возвращать предыдущее значение либо null для новой пары.
*/
public class Solution {
public static final ThreadLocalRandom RANDOM = ThreadLocalRandom.current();
public static void main(String[] args) {
ConcurrentMap<Integer, String> concurrentMap = new ConcurrentHashMap<>();
for (int i = 0; i < 100; i++) {
new Thread(getRunnable(i, concurrentMap)).start();
}
sleepASecond();
}
private static void sleepASecond() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static Runnable getRunnable(final int i, final ConcurrentMap<Integer, String> concurrentMap) {
return new Runnable() {
@Override
public void run() {
final String name = "Thread #" + i;
final int randomInt = RANDOM.nextInt(20);
String text = name + " вставил запись для " + randomInt;
//previousEntry is null if it is new entry
/* instead of null - call concurrentMap.someMethodName(randomInt, text)*/
String previousEntry = concurrentMap.putIfAbsent(randomInt, text);
if (previousEntry != null) {
System.out.println(name + " хочет обновить " + randomInt + ", однако уже " + previousEntry);
} else {
System.out.println(text);
}
}
};
}
}
Leave A Comment