小编Chr*_*got的帖子

多线程(即基于线程池的)Java应用程序中的损坏结果

我正在Java中尝试多线程,更具体地说是线程池。作为测试,我编写了一个应用程序,该应用程序使用多线程提高速度来简单地更改图像的颜色。但是,由于某种我不知道的原因,根据我如何设置此测试,我得到的结果是错误的。下面,我描述测试应用程序如何与完整的源代码一起工作。

任何帮助都非常欢迎!谢谢!

测试应用

我有一个用深蓝色初始化的400x300像素图像缓冲区,如下所示:

在此处输入图片说明

程序必须完全用红色填充它。

尽管我可以简单地遍历所有像素,并用红色依次为每个像素着色,但出于性能考虑,我还是决定利用并行性。因此,我决定用单独的线程填充每个图像行。由于行数(300行)比可用的CPU核心数大得多,因此我创建了一个线程池(包含4个线程),该线程池将消耗300个任务(每个任务负责填充一行)。

该计划的组织如下:

  • RGB类:将像素颜色保留为三元组的两倍。
  • RenderTask类:用红色填充图像缓冲区的给定行。
  • 渲染器类:
    • 创建图像缓冲区。
    • 用“ newFixedThreadPool”创建线程池。
    • 创建300个线程池要使用的任务。
    • 完成线程池服务。
    • 将图像缓冲区写入PPM文件。

您可以在下面找到完整的源代码(我将将此代码称为Version 1):

import java.util.concurrent.Executors;
import java.util.concurrent.ExecutorService;
import java.io.*;

class RGB {
    RGB() {}

    RGB(double r, double g, double b) {
        this.r = r;
        this.g = g;
        this.b = b;
    }

    double r;
    double g;
    double b;
}

class RenderTask implements Runnable {
    RenderTask(RGB[][] image_buffer, int row_width, int current_row) {
        this.image_buffer = image_buffer;       
        this.row_width = row_width;
        this.current_row = current_row; 
    }

    @Override
    public void …
Run Code Online (Sandbox Code Playgroud)

java multithreading threadpool

3
推荐指数
1
解决办法
78
查看次数

标签 统计

java ×1

multithreading ×1

threadpool ×1