使用Fork-Join框架的资源,创建一个同步多线程系统,从三个文本文件中形成一个最大长度的单词集合。不要使用中间集合来读取文本。在本例中,工作由存储在MaxLengthWord类的arr字段中的数组表示。createSubtasks()方法递归地将任务分成更小的工作部分,直到每个工作部分都小于阈值。
import java.io.File;
import java.util.*;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
import java.util.stream.Collectors;
public class loop {
public static void main(String[] args) {
File[] files = {
new File("text"),
new File("text2"),
new File("text3")
};
MaxLengthWord sumOfDigits = new MaxLengthWord(files);
ForkJoinPool pool = new ForkJoinPool();
final List<String> maxWords = pool.invoke(sumOfDigits);
System.out.println(maxWords);
}
}
class MaxLengthWord extends RecursiveTask<List<String>> {
File[] files;
private static final int MAXWORDLENGTH = 7;
public MaxLengthWord(File[] files) {
this.files = files;
}
@Override
protected List<String> compute() {
if (files.length > 1) {
return ForkJoinTask.invokeAll(createSubtasks())
.stream()
.flatMap(maxLengthWord -> maxLengthWord.join().stream())
.collect(Collectors.toList())
;
} else {
return processing(files);
}
}
private Collection<MaxLengthWord> createSubtasks() {
List<MaxLengthWord> subTasks = new ArrayList<>();
subTasks.add(new MaxLengthWord(
Arrays.copyOfRange(files, 0, files.length / 2)));
subTasks.add(new MaxLengthWord(
Arrays.copyOfRange(files, files.length / 2, files.length)));
return subTasks;
}
private List<String> processing(File[] files) {
System.out.println(Thread.currentThread());
List<String> result = new ArrayList<>();
try (Scanner sc = new Scanner(files[0])) {
while (sc.hasNext()) {
String word = sc.next();
if (word.length() == MAXWORDLENGTH) {
result.add(word);
}
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
流。flatMap()
方法需要一个返回流的函数接口。因此,我将join()
方法的结果转换为流。因此,这可能会有所帮助(至少可以编译):
@Override
protected List<String> compute() {
if (files.length > 1) {
return ForkJoinTask.invokeAll(createSubtasks())
.stream()
.flatMap(j->j.join().stream())
.collect(Collectors.toList());
} else {
return processing(files);
}
}
问题内容: 由于对设计模式和体系结构不熟悉,我很难向他人确切说明我的最新应用程序是如何设计的。我已经在认为它是纯n层,纯MVC和表示层中具有MVC的n层之间切换。目前,我认为后者是正确的,但我希望更多有经验的开发人员能有所作为。 浏览器将HTTP请求发送到Tomcat。通过web.xml将请求映射到servlet(我称为控制器) 控制器实例化一个或多个业务对象并在其上调用方法,即,该对象将在调用一
在我的JavaSpringMVC应用程序中,我有一个返回用户的DAO。DAO经常被命中,所以我尝试缓存用户。 我是这样做的(如下),但我不知道我是否做对了。 我在想使得它只运行一次,并且所有其他时间的值都将从缓存中加载。 和上的和会在发生更新或删除时清除缓存。 那是正确的吗?如果是,什么时候使用合适?
问题内容: 我想在Java中使用池化连接(因为每个线程创建一个连接非常昂贵),所以我正在使用该对象。我正在跨线程保留我的数据源。因此,我在整个应用程序中仅使用一个数据源,如下所示: 现在,我已经创建了数据源,然后在每个单独的线程中执行以下操作: 我猜我很困惑, 这真的 是在 获取池连接吗? 这个线程安全吗?我注意到PooledConnection具有诸如notify()和wait()之类的方法…这
我是DSA的初学者,最近几天我一直在尝试使用邻接列表找到图形的正确实现。 下面我给出了我认为邻接列表是如何实现的整个代码。 我从头开始创建了一个SiinglyLinkedlist。并且我正在使用一个Hashmap来改进时间复杂性。 Hashmap中的整数键充当顶点&在其值中包含一个Linkedlist。 在顶点中,我存储了整数ID,在Linkedlist中,我存储了该ID的所有好友名。 图中有3种
问题内容: 我正在实现一个可序列化的类(因此,它是一个使用RMI的值对象)。但是我需要测试一下。有没有一种方法可以轻松做到这一点? 澄清 :我正在实现该类,因此将Serializable保留在类定义中很简单。我需要手动对其进行序列化/反序列化,以查看其是否有效。 问题答案: 简单的方法是检查对象是否为或的实例,但这并不能真正证明该对象确实可序列化。 唯一可以确定的方法是实际尝试。最简单的测试是这样
我们的应用程序使用各种类型的队列。每次在启动使用队列的应用程序之前,都会进行一次自动预检查,将示例消息写入所需队列并读取(即删除)它,以确认队列设置是否正确。 现在我们也用Kafka。但是在Kafka中,我们不能通过写和读带有主题的消息来进行预检查,因为在启动实际应用程序之前不能删除这些消息,这会“污染”主题。在Kafka中是否有其他自动化的方法,API或命令行脚本来实现这一点?最好使用java或