У меня проблема с многопоточными в Java. Мне нужно сравнить большой список имен с самим собой (найти почти дубликаты).Темы в java не работают одновременно
Я разделил работу на 4 разных потока, каждый из которых сравнивал 1/4 списка с полным списком. Я использую тот же класс для всех 4 потоков.
Когда я смотрю на монитор потока, я вижу, что они не работают одновременно, они активны один за другим.
В чем проблема?
Это вводный метод моей резьбы класса:
@Override
public void run() {
try {
s = settings.conn.createStatement();
JaroWinklerDistance jw = JaroWinklerDistance.JARO_WINKLER_DISTANCE;
for (int i = 0; i < names.size(); i++) {
for (int j = 0; j < allNames.size(); j++) {
if (j % 250 == 0) {
}
double proximity = jw.proximity(names.get(i), allNames.get(j));
if (proximity > Double.parseDouble(settings.properties.getProperty("distanceTreshold")) && proximity < 1.00) {
if (names.get(i).length() > allNames.get(j).length()) {
substituteName(allNames.get(j), names.get(i));
allNames.remove(allNames.get(j));
} else {
substituteName(names.get(i), allNames.get(j));
names.remove(names.get(i));
break;
}
}
}
}
} catch (SQLException ex) {
Exceptions.printStackTrace(ex);
}
}
substituteName-метод выполняет SQL-запрос, который обновляет запись.
Нить создается следующим образом:
settings.getAllNames();
int size = settings.allNames.size();
int rest = size % 4;
int groupSize = (size-rest)/4;
GroupNormalizer a = new GroupNormalizer(settings.allNames, new ArrayList<String>(settings.allNames.subList(0, groupSize)));
GroupNormalizer b = new GroupNormalizer(settings.allNames, new ArrayList<String>(settings.allNames.subList(groupSize, (groupSize*2))));
GroupNormalizer c = new GroupNormalizer(settings.allNames, new ArrayList<String>(settings.allNames.subList((groupSize * 2), (groupSize * 3))));
GroupNormalizer d = new GroupNormalizer(settings.allNames, new ArrayList<String>(settings.allNames.subList((groupSize * 3), (groupSize*4 + rest))));
a.start();
b.start();
c.start();
d.start();
EDIT: все 4 нити чередовать много между работой и монитором (заблокированной) -Status
Трудно сказать, не видя своего кода – hage
Некоторый код был бы неплохо проанализировать, что может быть неправильно. –
Я использую четырехъядерный ядро. Класс thread сравнивает часть большого списка.Если он находит почти дубликат, он обновляет записи базы данных соответственно. – Freek8