java - 新线程卡住应用

标签 java multithreading concurrency

我有一个资源密集型应用程序,它使用大图像作为输入,对这些图像的某些操作可能需要一段时间。因此,我希望让某些部分在它们自己的线程中运行。为此,我首先使用了以下代码进行测试:

Thread t1 = new Thread(new Runnable() {
public void run()
{
inputChooser.setFileFilter(filter);
    inputChooser.addChoosableFileFilter(filter);
    int img = inputChooser.showOpenDialog(this);

    if (img == JFileChooser.APPROVE_OPTION) {
        File file = inputChooser.getSelectedFile();
        String filename = file.getName();
        if (filename.contains("B10")) {
            greenBand = 1;
        }
        if (filename.contains("B20")) {
            greenBand = 2;
        }
        if (filename.contains("B30")) {
            greenBand = 3;
        }
        if (filename.contains("B40")) {
            greenBand = 4;
        }
        if (filename.contains("B50")) {
            greenBand = 5;
        }
        if (filename.contains("B60")) {
            greenBand = 6;
        }
        if (filename.contains("B70")) {
            greenBand = 7;
        }
        try {
            greenImage = ImageIO.read(file);
            ImageIO.write(greenImage, "JPEG", new File("img2_tmp.jpeg"));

            greenImage = ImageIO.read(new File("img2_tmp.jpeg"));
            if (greenImage.getWidth() > 8000 | greenImage.getHeight() > 7000) {
            greenImage = greenImage.getSubimage(1450, 1400, (greenImage.getWidth()-3200), (greenImage.getHeight()-3000));
            }
            update(greenImage, greenIcon, greenLabel);

            loadingBar.setIndeterminate(false);

            checkInput();
        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, "Input Image Error", "Input Error", WARNING_MESSAGE);
        }

    }
}});
t1.start();

当我运行应用程序时,它会在调用此代码时卡住。但是,我设法让它运行了一次,我不确定它是如何运行的(不是第一次,它先卡住了几次,然后随机运行了一次)。我没有更改任何代码,只是更改了一些缩进,以使其与其余代码相适应,而且自从它继续卡住以来。按下按钮操作会在上面的代码所在的位置调用此方法,一旦按下按钮,它就会卡住。

发生这种情况是否有原因?

提前致谢

最佳答案

您正在同时从两个线程(新创建线程和主线程)调用非线程安全代码(swing(不是线程安全的))。

确保在创建新线程之前已将逻辑解耦。

对于这个特定的用例,我建议您使用 SwingWorker 代替线程,它们易于使用,并且在 swing 的限制内工作良好。

有关 SwingWorker 的更多信息,请访问 http://docs.oracle.com/javase/tutorial/uiswing/concurrency/worker.html

希望这对您有所帮助。
祝你好运。

关于java - 新线程卡住应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22466383/

相关文章:

java - 使用 protobuf 创建 kafka 消费者

Java 邮件在打开Folder.open 时卡住

android - 在 Android 的后台线程中使用 CountDownTimer

c++ - 如果我在 _mm_clflushopt() 之后不发出 _mm_sfence() 会发生什么(不好的)事情?

java - Android SQLite数据库版本,更改结构现在无法查看DB

java - 在Android中比较mac地址?

multithreading - NUnit控制台: “WaitAll for multiple handles on a STA thread is not supported” 中的错误

java - 为什么并行流不使用ForkJoinPool的所有线程? [复制]

multithreading - 为什么与信号量解决方案会合不能推广(我们使用屏障代替)?

java - 根据类大小创建对象的内存分配量