java - 如何使用多线程来完成一项工作?

标签 java multithreading swing

下面的代码适用于分形曼德尔布罗。它工作得很好,但现在我想在上面使用线程的概念。结果应该是相同的,但工作必须由多个线程完成 +10。

这是我的代码:

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;

public class test extends JFrame {

    private final int MAX_ITER = 570;
    private final double ZOOM = 150;
    private BufferedImage I;
    private double zx, zy, cX, cY, tmp;
    private static int x,y;

    public test() throws InterruptedException {
        super("Mandelbrot Set");
        setBounds(100, 100, 800, 600);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        I = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
        for ( y = 0; y < getHeight(); y++) {

            for ( x = 0; x < getWidth(); x++) {
                Thread T = new Thread() {//*******
                    public void run() {

                          zx = zy = 0;
                          cX = (x - 400) / ZOOM;
                          cY = (y - 300) / ZOOM;
                          int iter = MAX_ITER;
                          while (zx * zx + zy * zy < 4 && iter > 0) {
                              tmp = zx * zx - zy * zy + cX;
                              zy = 2.0 * zx * zy + cY;
                              zx = tmp;
                              iter--;
                          }
                          I.setRGB(x, y, iter | (iter << 8));
                          System.out.println(Thread.currentThread().getId());
                    }

                };//*******

                T.start();//********
                T.join();//**********

            }
        }
    }

    @Override
    public void paint(Graphics g) {
        g.drawImage(I, 0, 0, this);
    }

    public static void main(String[] args) throws InterruptedException {
        new test().setVisible(true);
    }
}

我尝试在循环中实例化线程,但没有得到我想要的结果 有什么建议吗?

最佳答案

您在启动线程后立即调用T.joinThread#join阻塞当前线程,直到该线程完成。这意味着计算将在另一个线程上进行,但您不会获得并行性的任何好处,因为在该线程完成之前您不会启动另一个线程。

您可以启动所有线程并等待它们一起完成,方法是使用 CountDownLatch 之类的东西。或尝试使用 fork/join framework

关于java - 如何使用多线程来完成一项工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50995799/

相关文章:

java - JXDatePicker 返回错误的日期

java - J 帧按纵横比调整大小

java - 从 xml 中提取标签的值,其中 xml 消息以字符串形式出现

java - DataInputStream读取不阻塞

java - 同一个集合 : do they have to return elements in the same order? 的两个 java.util.Iterators

java - 线程数组的最佳实践 (java)

Pythonistas,请帮助将其转换为利用 Python 线程概念

java - 如何解决这种多任务场景中任务长时间中断的问题?

java - 如何在循环中使用paintComponent?

Java多线程读取单个大文件