Java线程:实时应用程序示例

时间:2015-09-01 12:46:03

标签: java multithreading

我在一次采访中被问到一个问题,我在主要方法中有列表可用,并且我被告知要对列表中的每个项目执行一些操作,我将如何使用线程概念实现此目的。 请考虑以下情形: 我有一个整数列表。我需要打印列表中的所有值。可以使用线程概念来完成,其中我在列表中的每个项目上运行多个线程,并且每个线程用于打印一个值而不是一个线程打印所有值?我不是要修改列表中的任何值。

5 个答案:

答案 0 :(得分:0)

是的,这是典型的生产者 - 消费者范例:

想象一个Runnable类,它接收Iterator作为参数,等待某个监视器,然后从迭代器中消耗一个项目,最后通知同一个监视器。迭代器有更多项时循环。

在此之后,创建数字列表就足够了,创建消费者线程将它们传递给列表的迭代器,然后启动它们。

答案 1 :(得分:0)

以下代码根本未经过测试。这只是想到的东西。使用parallelStream()的最后一个实现可能就是你要找的。

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)