Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 设置正确的多线程_Java_Multithreading - Fatal编程技术网

Java 设置正确的多线程

Java 设置正确的多线程,java,multithreading,Java,Multithreading,不幸的是,我对如何正确设置线程的理解很差。我知道在SO.SE和其他网站上都有很多关于这方面的信息,但我似乎无法将我读到的内容与我正在做的事情联系起来 我的问题是,我有一个方法,采用两个参数,其中一个被另一个除以。商(结果)用于填充视觉进度条。当商为1时,(readBytes/contentLength==1),我希望一些线程(我猜)在从布局中删除进度条之前等待给定的时间。我知道为进度条设置值所需的所有代码,以及如何将其从视图中删除,我的问题是如何使其等待,例如,2000毫秒,然后触发删除组件的操

不幸的是,我对如何正确设置线程的理解很差。我知道在SO.SE和其他网站上都有很多关于这方面的信息,但我似乎无法将我读到的内容与我正在做的事情联系起来

我的问题是,我有一个方法,采用两个参数,其中一个被另一个除以。商(结果)用于填充视觉进度条。当商为1时,
(readBytes/contentLength==1)
,我希望一些线程(我猜)在从布局中删除进度条之前等待给定的时间。我知道为进度条设置值所需的所有代码,以及如何将其从视图中删除,我的问题是如何使其等待,例如,2000毫秒,然后触发删除组件的操作

这可能是基本的线程知识,但我有很大的问题

到目前为止,我已经尝试了以下两种方法:

@Override
    public void updateProgress(long readBytes, long contentLength) {

        this.contentLength = contentLength;

        if(readBytes != 0 && contentLength != 0 && fileListItem != null)    {

            fileListItem.getProgressIndicator().setValue(readBytes/contentLength);

            synchronized (this) {
                while(readBytes/contentLength != 1) {
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    };
                    fileListItem.removeProgressIndicator();                 
                }
            }
        }

        if(!itemIsAdded)    {

            checkFileCompatibility(contentLength);

        }
    }

@Override
    public void updateProgress(long readBytes, long contentLength) {

        this.contentLength = contentLength;

        if(readBytes != 0 && contentLength != 0 && fileListItem != null)    {

            if(readBytes/contentLength == 1)    {
                Thread t = new Thread();
                t.start();
                try {
                    t.wait(2000);
                    fileListItem.removeProgressIndicator();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                t.interrupt();
            } else  {
                fileListItem.getProgressIndicator().setValue(readBytes/contentLength);
            }
        }

        if(!itemIsAdded)    {

            checkFileCompatibility(contentLength);

        }
    }
没有成功。在第一个示例中,主线程似乎是一个正在等待的线程,什么也没有发生。在第二个例子中,我在
t.wait(2000)上得到一个异常。我不知道该怎么办

编辑:根据波希米亚人的输入,我让它工作了

@Override
    public void updateProgress(final long readBytes, final long contentLength) {

        this.contentLength = contentLength;

        if(readBytes != 0 && contentLength != 0 && fileListItem != null)    {

            if(!threadIsRunning)    {
                new Thread(new Runnable() {

                    @Override
                    public void run() {
                        threadIsRunning = true;
                        while(!fileIsAdded) {
                            try {
                                Thread.sleep(2000);
                            } catch (InterruptedException e) {
                                // TODO Auto-generated catch block
                                LOGGER.error(e.getMessage());
                                break;
                            }
                        }
                        fileListItem.removeProgressIndicator();
                        threadIsRunning = false;
                    }
                }).start();
            }

            fileListItem.getProgressIndicator().setValue(readBytes/contentLength);
            if(readBytes == contentLength)
                fileIsAdded = true;
        }

        if(!itemIsAdded)    {

            checkFileCompatibility(contentLength);

        }
    }

它仍然需要一些整理,但基本的工作,现在

我想你真正需要的是

Thread.sleep(2000);
而不是等待
。虽然
wait
可以用于睡眠,但它的主要功能是线程间信令,并且需要对正在等待的对象进行锁定,而您尚未获得该锁定,因此出现异常

编辑:进一步检查后,我发现您的操作不正确。您只是在创建一个没有关联的
run
方法的线程:

Thread t = new Thread();
t.start();
因此,线程没有执行任何操作


我建议阅读一篇关于如何正确设置线程的Java线程教程:

我认为您真正需要的是

Thread.sleep(2000);
而不是等待。虽然
wait
可以用于睡眠,但它的主要功能是线程间信令,并且需要对正在等待的对象进行锁定,而您尚未获得该锁定,因此出现异常

编辑:进一步检查后,我发现您的操作不正确。您只是在创建一个没有关联的
run
方法的线程:

Thread t = new Thread();
t.start();
因此,线程没有执行任何操作


我建议阅读关于如何正确设置线程的Java线程教程:

我不会让主线程等待。这是一种不好的做法,因为它不可伸缩,并且使您的GUI不稳定

相反,我将向工作线程传递一个超时值和两个超时值,以便在它超过超时/完成其工作时执行。这样,主线程就可以自由地返回到它想做的任何事情

为了便于说明,您的“完成”回调可能如下所示:

new Runnable() {
    public void run() {
        // code that hides the progress bar
    }
}
new Runnable() {
    public void run() {
        // code that displays an error message
    }
}
您的“超时”回调可能如下所示:

new Runnable() {
    public void run() {
        // code that hides the progress bar
    }
}
new Runnable() {
    public void run() {
        // code that displays an error message
    }
}
顺便说一下,要让线程执行某些操作,还需要向其传递一个Runnable:

new Thread(new Runnable() {
    public void run() {
        // code that runs when your thread starts
    }
}).start();

我不会让主线程等待。这是一种不好的做法,因为它不可伸缩,并且使您的GUI不稳定

相反,我将向工作线程传递一个超时值和两个超时值,以便在它超过超时/完成其工作时执行。这样,主线程就可以自由地返回到它想做的任何事情

为了便于说明,您的“完成”回调可能如下所示:

new Runnable() {
    public void run() {
        // code that hides the progress bar
    }
}
new Runnable() {
    public void run() {
        // code that displays an error message
    }
}
您的“超时”回调可能如下所示:

new Runnable() {
    public void run() {
        // code that hides the progress bar
    }
}
new Runnable() {
    public void run() {
        // code that displays an error message
    }
}
顺便说一下,要让线程执行某些操作,还需要向其传递一个Runnable:

new Thread(new Runnable() {
    public void run() {
        // code that runs when your thread starts
    }
}).start();
在所有的可能性是正确的工具为您的任务。Javadoc中有一个完整的代码示例。请注意方法
setProgress
——这是更新进度条的理想方法

如果您所需要的只是一个固定的2秒延迟来清除进度条,那么您需要使用。它甚至不涉及多线程,您只需编写一个回调处理程序,它将在指定的延迟后执行。

很可能是执行任务的正确工具。Javadoc中有一个完整的代码示例。请注意方法
setProgress
——这是更新进度条的理想方法


如果您所需要的只是一个固定的2秒延迟来清除进度条,那么您需要使用。它甚至不涉及多线程,您只需编写一个回调处理程序,它将在指定的延迟后执行。

谢谢Tudor。是的,我确实需要更仔细地研究这个课题。谢谢你的意见,谢谢都铎。是的,我确实需要更仔细地研究这个课题。感谢您的输入。感谢Marko,但是代码已经在重写的框架方法中运行。我无法以允许我使用SwingWorker的方式调整它。如果允许您启动另一个线程,为什么您不能实例化一个
SwingWorker
?我无法想象这种情况。我以前不知道SwingWorker线程。现在我已经查找了它,虽然它似乎是一个完美的工具,当您完全自己开发GUI时可以使用,但我认为它不适用于我的项目环境。我正在使用一个名为Vaadin的web应用程序框架,类似于GWT,处理用户触发器侦听器的线程已经与主线程分离。这意味着在执行操作时,我通常不关心GUI冻结。不过,我感谢您的输入,+1感谢Marko,但代码已经在重写的框架方法中运行。我无法以允许我使用SwingWorker的方式调整它。如果允许您启动另一个线程,为什么您不能实例化一个
SwingWorker
?我无法想象这种情况。我以前不知道SwingWorker线程。现在我查了一下,虽然它似乎是使用wh的完美工具