Этот метод найдет максимальное значение, используя последовательный поток. Вы также включите паузу перед обработкой каждого элемента.
Реализация MultipleThreadSearch
Этот метод будет использовать параллельные потоки для поиска максимального значения в каждой строке, а затем определять максимальное значение среди эти результаты. Он также будет включать паузу.
Я реализовал оба этих метода ниже.
Код: Выделить всё
package com.epam.rd.autocode.threads.maxbystreams;
import java.util.Arrays;
public class MaxOfMatrix {
/**
* Pauses current thread for {@code pause} millis
*
* @param pause time in millis
*/
private static void pause(int pause) {
try {
Thread.sleep(pause);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
public static String oneThreadSearch(int[][] matrix, int pause) {
long before = System.currentTimeMillis();
int max = Arrays.stream(matrix)
.flatMapToInt(Arrays::stream)
.peek(e -> pause(pause))
.max()
.orElse(Integer.MIN_VALUE);
return max + " " + (System.currentTimeMillis() - before);
}
public static String multipleThreadSearch(int[][] matrix, int pause) {
long before = System.currentTimeMillis();
int max = Arrays.stream(matrix)
.parallel()
.map(row -> Arrays.stream(row)
.peek(e -> pause(pause))
.max()
.orElse(Integer.MIN_VALUE))
.max(Integer::compare)
.orElse(Integer.MIN_VALUE);
return max + " " + (System.currentTimeMillis() - before);
}
}
testCompilance:
Код: Выделить всё
package com.epam.rd.autocode.threads.maxbystreams;
import org.junit.jupiter.api.Test;
import spoon.Launcher;
import spoon.SpoonAPI;
import spoon.reflect.CtModel;
import spoon.reflect.code.CtBlock;
import spoon.reflect.code.CtReturn;
import spoon.reflect.code.CtStatement;
import spoon.reflect.declaration.CtClass;
import spoon.reflect.declaration.CtField;
import spoon.reflect.declaration.CtMethod;
import spoon.reflect.declaration.CtType;
import spoon.reflect.visitor.Filter;
import spoon.reflect.visitor.filter.TypeFilter;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import static org.junit.jupiter.api.Assertions.*;
public class ComplianceTest {
private static final String CLASS_NAME = MaxOfMatrix.class.getName();
static CtModel ctModel = init();
static CtModel init() {
SpoonAPI spoon = new Launcher();
spoon.addInputResource("src/main/java/");
return ctModel = spoon.buildModel();
}
@Test
void testCompliance() {
assertTrue(isImplemented("oneThreadSearch") &&
isImplemented("multipleThreadSearch"),
"Must be implemented");
testNoMoreClasses();
testNoMoreFields();
testNoMoreMethods();
testNoMoreThan2Statement("oneThreadSearch");
testNoMoreThan2Statement("multipleThreadSearch");
}
// no more classes
void testNoMoreClasses() {
List types = ctModel.filterChildren((Filter el) -> el.getQualifiedName())
.list();
assertEquals(0, types.size(),
"You must not add any other classes.");
}
// no more classes
void testNoMoreFields() {
CtType type = ctModel.filterChildren((Filter>) el -> true).list();
assertEquals(0, fields.size(),
"You must not add any fields.");
}
// no more methods
void testNoMoreMethods() {
List method = ctModel.filterChildren((CtClass el) ->
el.getQualifiedName()
.equals(CLASS_NAME))
.filterChildren((CtMethod el) -> {
String simpleName = el.getSimpleName();
return simpleName.equals(methodName);
})
.first();
assertNotNull(method, "The method must be present: " + methodName);
List statements = method.getBody().getStatements()
.stream()
.filter((CtStatement st) -> !(st instanceof CtReturn))
.toList();
assertEquals(1, statements.size(),
"You can develop the method using only two statement " +
"and one of them must be 'return ...'. " +
"Found except 'return ...':\n" + statementsToString(statements));
}
// is implemented
static boolean isImplemented(String methodName) {
CtReturn method = ctModel.filterChildren((CtClass el) ->
el.getQualifiedName()
.equals(CLASS_NAME))
.filterChildren((CtMethod el) -> {
String simpleName = el.getSimpleName();
return simpleName.equals(methodName);
})
.filterChildren((CtBlock body) -> true)
.filterChildren((CtReturn st) -> true)
.first();
return !method.toString().contains("return null");
}
String statementsToString(List statements) {
return statements.stream()
.map(Objects::toString)
.collect(Collectors.joining("'\n~ '", "~ '", "'\n"));
}
}
Код: Выделить всё
@ParameterizedTest
@CsvSource({"2,10,5", "15,4,10", "13,7,7"})
void testShouldBeAtLeastMThreadsWhenMultipleThreadSearchIsExecuted(int m, int n, int pause) throws Exception {
Set threadNames = new TreeSet();
int poolSize = ForkJoinPool.getCommonPoolParallelism();
m = Math.max(m, poolSize);
int[][] ar = matrixGenerator(new Random(25), m, n);
Thread t = startThreadsDetector(threadNames, "ForkJoinPool.commonPool-worker-", pause);
MaxOfMatrix.multipleThreadSearch(ar, pause);
t.join();
long threadsCount = threadNames.size();
Assertions.assertEquals(poolSize, threadsCount,
"'multipleThreadSearch' must use " + poolSize + " threads, " +
"detected threads are: " + threadNames);
}
Подробнее здесь: https://stackoverflow.com/questions/791 ... rs-gives-o