Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.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,我只是通过创建一些小程序来学习多线程,我发现了一件具体的事情,我不知道为什么会是这样 我有两个班,他们都有20亿,最后他们打印出他们做这件事所花的时间。它们在不同的文件中。第一个线程可以在大约2秒钟内完成(速度会更快,但我也在做其他事情),还有新线程(newrunnable()) 在主课上要慢得多,大约花了8秒钟。你能解释一下为什么吗?这是代码。多谢各位 public class First implements Runnable { private long startTime, endTi

我只是通过创建一些小程序来学习多线程,我发现了一件具体的事情,我不知道为什么会是这样

我有两个班,他们都有20亿,最后他们打印出他们做这件事所花的时间。它们在不同的文件中。第一个线程可以在大约2秒钟内完成(速度会更快,但我也在做其他事情),还有新线程(newrunnable())

在主课上要慢得多,大约花了8秒钟。你能解释一下为什么吗?这是代码。多谢各位

public class First implements Runnable {

private long startTime, endTime;
public static double count = 0;

@Override
public void run() {
    startTime = System.currentTimeMillis();

    for (int count = 0; count <= 2000000000L; count++);

    endTime = System.currentTimeMillis();
    System.out.println(endTime - startTime); //it is done in about 2seconds
  }
 }


public class Threads {

   public static void main(String[] args){

         First f = new First();
         f.run();

     new Thread(new Runnable() {

        @Override
        public void run() {

            long startTime, endTime;
            double count;
            startTime = System.currentTimeMillis();

            for (count = 0; count < 2000000000L; count++)l

            endTime = System.currentTimeMillis();
            System.out.println(endTime - startTime); //about 8 seconds

        }
    }).start();
 }
}
public类首先实现Runnable{
私人长开始时间,结束时间;
公共静态重复计数=0;
@凌驾
公开募捐{
startTime=System.currentTimeMillis();

对于(int count=0;count,它与线程无关。请仔细查看您的代码(顺便说一句,代码很乱),第一个示例使用int i作为循环索引,第二个示例使用double i作为循环索引。double是不同的数据类型,通常比int慢得多。

一种可能性是,在第二个示例中,计数器是double而不是整数。根据体系结构和特定操作,整数和double具有不同的性能mance.增加值可能是一种特殊情况,但在您的计算机上,增加双精度可能比增加整数慢。请尝试将
双精度i
替换为
整数i
,然后查看其执行情况


来源:

不同之处在于,
i
变量中的一个是
double
,另一个是
int
。要添加到该注释上,我相信您的意思是使用第4行定义的class字段
i
。只需删除第11行循环中的
int
标记。天哪:我没有意识到,真的正因为如此,谢谢,很抱歉,我提出了这么一个愚蠢的问题。没问题。我花了一两秒钟才真正找到那个小错误。那个狡猾的小家伙哈哈,我知道它看起来不太好。我的电脑上还有一点代码,我只是复制了它的重要部分。至少我学到了一些新东西,谢谢。@MartinŠvoňava你应该使用单词来表示变量,而不是单个字母,因为这些字母没有任何意义。特别是,如果你想寻求他人的帮助,那么标准化你的代码并使用有意义的变量名将大大加快其他人理解你的代码的过程。对于个人项目,我可以理解,但是在线发布前“预处理”代码确实对我们和未来的读者有所帮助。我指的不是格式,尽管这也会让人分心。我发现混乱的是声明单字母实例成员并使用它们代替局部变量(私有长x,z),而您可能打算使用类成员静态双精度i“也在某个地方。+1库尔特伯特,为了重新强调这一点,“预绑”通常已经发现了问题(至少对我来说是这样)。是的,我发现int要快得多,我第一次使用双精度,因为我想数到200亿而不是2,所以出现了一个错误。