Как закоротить при использовании параллельного потока с фильтром и findFirstJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как закоротить при использовании параллельного потока с фильтром и findFirst

Сообщение Anonymous »

У меня есть список значений TxnType различной сложности (длительности процесса).
Я хочу найти соответствующий TxnType из списка. >
Я пытался реализовать это, сочетая функции параллельной обработки и фильтрации короткого замыкания потока, но заметил, что это не смесь.
Я написал приведенный ниже образец. Но заметил, что сочетание параллельного и короткого замыкания не работает должным образом.
Каждый запуск показывает, что параллельная обработка работает, но не завершается при обнаружении, как только найден элемент!!!

Код: Выделить всё

    class TxnType {
public String id;
public TxnType(String id) {this.id = id;}

public boolean match(String entry) {
Date s = new Date();
// simulate long processing match time TxnType
if (id.equals("1")) {
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Date f = new Date();
System.out.println("check id = " + id+ "  duration = "+(f.getTime()- s.getTime()));

return id.equalsIgnoreCase(entry);
}
}

private void test4() {
// build list of available TxnTypes
ArrayList lst = new ArrayList();
lst.add(new TxnType("0"));
lst.add(new TxnType("1"));  // long match processing time type
lst.add(new TxnType("2"));
lst.add(new TxnType("3"));
lst.add(new TxnType("4"));

String searchFor = "3";
System.out.println("searchFor = " + searchFor);
Date st, fi;

st = new Date();
Optional found2 =lst.stream().parallel().filter(txnType->txnType.match(searchFor)).findFirst();
System.out.println("found.stream().count() = " + found2.stream().count());
fi= new Date();
System.out.println("dur="+ (fi.getTime()- st.getTime()));
}
Запустив несколько раз, я обнаружил, что обработка не была прекращена как можно скорее, и жду обработки всех из них!!!!

Код: Выделить всё

searchFor = 3
check id = 4  duration = 0
check id = 2  duration = 0
check id = 3  duration = 0
check id = 0  duration = 0
check id = 1  duration = 4005
found.stream().count() = 1
dur=4050
Есть ли что-то вроде filterFindFirst()?


Подробнее здесь: https://stackoverflow.com/questions/681 ... -findfirst
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»