我在一次采访中被问到一个问题,我在主要方法中有列表可用,并且我被告知要对列表中的每个项目执行一些操作,我将如何使用线程概念实现此目的。 请考虑以下情形: 我有一个整数列表。我需要打印列表中的所有值。可以使用线程概念来完成,其中我在列表中的每个项目上运行多个线程,并且每个线程用于打印一个值而不是一个线程打印所有值?我不是要修改列表中的任何值。
答案 0 :(得分:0)
是的,这是典型的生产者 - 消费者范例:
想象一个Runnable类,它接收Iterator作为参数,等待某个监视器,然后从迭代器中消耗一个项目,最后通知同一个监视器。迭代器有更多项时循环。
在此之后,创建数字列表就足够了,创建消费者线程将它们传递给列表的迭代器,然后启动它们。
答案 1 :(得分:0)
以下代码根本未经过测试。这只是想到的东西。使用parallelStream()的最后一个实现可能就是你要找的。 p>
public class DemoApplication {
public static void main(String[] args) {
final List<Integer> myIntegerList = Arrays.asList(1, 2, 3);
// Good old for-each-loop
for (Integer item : myIntegerList) {
System.out.print(item);
}
// Java 8 forEach with Consumer
final Consumer<Integer> consumer = new Consumer<Integer>() {
@Override
public void accept(Integer item) {
System.out.print(item);
}
};
myIntegerList.forEach(consumer);
// Java 8 forEach with Lambda
myIntegerList.forEach((item) -> System.out.print(item));
// Java 8 forEach on parallelStream with Lambda
myIntegerList.parallelStream().forEach((item) -> System.out.print(item));
}
}
答案 2 :(得分:0)
我想了解线程的优势。
在程序中使用多个线程基本上有两个原因:
(1)异步事件处理:想象一个程序必须等待并响应几种不同的输入,并且每种输入都可以在完全任意的时间发生。
在线程之前,我们曾经编写了一个大的事件循环,它将轮询用于每种不同类型的事件,然后调度到不同的处理程序函数。当一个或多个事件处理程序有状态时,事情可能开始变得丑陋(即,它接下来做的事情将取决于先前事件的历史。)
每个不同类型的事件都有一个线程的程序通常更清晰。也就是说,它更容易理解,更容易修改等。每个线程循环只等待一种事件,其状态(如果有的话)可以保存在局部变量中,或者它的状态可以是隐式(即,取决于线程在任何给定时间的函数)。
( 2)多处理(又名&#34;并行处理&#34;,&#34;并发编程&#34;,......):使用工作线程执行后台计算可能是目前使用最广泛的多处理模型。
多线程是所有多处理模型中最低级别的,这意味着(a)它是最难理解的,但(b)它是最通用的。
答案 3 :(得分:0)
这是可以的。我们可以使用concurrenthashmap。我们可以将列表添加到此映射并将其传递给线程。每个线程都会尝试获取资源上的锁来操作。
答案 4 :(得分:-1)
我希望你正在寻找类似的东西:
public class MaltiThreadExample {
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
for (int i : list) {
Thread th = new Thread() {
@Override
public void run() {
System.out.println(i);
}
};
th.start();
}
}
}
输出是一次执行:
run:
3
1
2
BUILD SUCCESSFUL (total time: 0 seconds)