繁体   English   中英

Java 处理一个数组多线程

[英]Java process one array with multiple threads

我想在我的程序中实现多个线程。 这些多个线程应该能够处理一个数组。

例如:

我有一个 integer 数组:

int[] integerArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

现在,多个线程应该将每个项目打印到控制台,如下所示:

1 //Printed by Thread 1
2 //Printed by Thread 2
7 //Printed by Thread 1
8 //Printed by Thread 2
9 //Printed by Thread 3
4 //Printed by Thread 1
5 //Printed by Thread 2
6 //Printed by Thread 3
3 //Printed by Thread 3
10 //Printed by Thread 1
11 //Printed by Thread 2
12 //Printed by Thread 3

(结果是否随机并不重要。)

到目前为止,我的解决方案是将数组拆分为更小的块。 这是有效的,但我不太喜欢这个解决方案,我认为这不是真正的线程安全

    public static void main(String[] args) {

        int[] integerArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

        int chunk = 3;
        for (int i = 0; i < integerArray.length; i += chunk) {

            int finalI = i;

            new Thread(() -> {
                int[] splittedArray = Arrays.copyOfRange(integerArray, finalI, Math.min(integerArray.length, finalI + chunk));
                for (int value : splittedArray) {
                    System.out.println(value);
                }

            }).start();
        }

    }

出于您在上面给出的示例中的目的,您不需要拆分数组以将部分传递给并行线程。 使用并行流处理数组元素将为您完成:

public static void main(String... args) {
    int[] integerArray = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    Arrays.stream(integerArray)
            .parallel()
            .forEach(x -> System.out.println(Thread.currentThread().getName() + " printed value: " + x));
}

在 output 上,您可以看到ForkJoinPool-Worker-Threads正在打印您的元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM