Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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,调用'Moon m=new Moon();'时,最下面的代码会变慢;。 为了解决这个问题,我想将下面的代码放在一个线程或其他东西中,以便moonCalTimer更快地退出并将值返回给其他函数。你知道怎么把它放在一条线或类似的东西里吗 Moon m = new Moon(); isWaning = m.isWaning(); fullMoon = MoonPhaseFinder.findFullMoonFollowing(Calendar.getInstance()); newMoon

调用'Moon m=new Moon();'时,最下面的代码会变慢;。 为了解决这个问题,我想将下面的代码放在一个线程或其他东西中,以便moonCalTimer更快地退出并将值返回给其他函数。你知道怎么把它放在一条线或类似的东西里吗

Moon m = new Moon();
isWaning = m.isWaning();     
fullMoon = MoonPhaseFinder.findFullMoonFollowing(Calendar.getInstance());
newMoon = MoonPhaseFinder.findNewMoonFollowing(Calendar.getInstance());
代码:


如果您希望代码继续运行,您可以执行以下操作:

new Thread()
{
    public void run() {
        Moon m = new Moon();
    }
}.start();

如果您想使用m对象,我认为您可能需要的是,您应该创建一个实现runable的新类,传递m,然后调用start。

您可以在
将来将计算包装起来。然后,您将创建future并在其自己的线程中开始计算,然后将
future
交还给调用者。这将允许调用方在计算完成之前获取其
未来的
结果

private final ExecutorService pool = Executors.newFixedThreadPool(10);

public Future<Boolean> isWaning(final Moon moon) throws IOException {
  return pool.submit(new Callable<Boolean>() {
    @Override
    public Boolean call() throws Exception {
      return moon.isWaning();
    }

  }
  );
}

public Future<Boolean> fullMoonFollowing(final Moon moon) throws IOException {
  return pool.submit(new Callable<Boolean>() {
    @Override
    public Boolean call() throws Exception {
      return MoonPhaseFinder.findFullMoonFollowing(Calendar.getInstance());
    }

  }
  );
}

public Future<Boolean> newMoonFollowing(final Moon moon) throws IOException {
  return pool.submit(new Callable<Boolean>() {
    @Override
    public Boolean call() throws Exception {
      return MoonPhaseFinder.findNewMoonFollowing(Calendar.getInstance());
    }

  }
  );
}
private final executor服务池=Executors.newFixedThreadPool(10);
公众的未来正在衰退(最终的月亮)抛出了一个例外{
返回池.submit(新的可调用(){
@凌驾
公共布尔调用()引发异常{
月圆;
}
}
);
}
公众未来满月(最终月亮)抛出IOException{
返回池.submit(新的可调用(){
@凌驾
公共布尔调用()引发异常{
返回MoonPhaseFinder.findFullMoonFollowing(Calendar.getInstance());
}
}
);
}
公共未来新月(最终月亮)抛出IOException{
返回池.submit(新的可调用(){
@凌驾
公共布尔调用()引发异常{
返回MoonPhaseFinder.findNewMoonFollowing(Calendar.getInstance());
}
}
);
}

您每小时只执行一次此计算-提前几秒钟开始计算不是更好,而不是掩盖线程的问题吗?这也会在程序开始时运行,因此返回值最多需要2分钟。@Ossama:但在另一个线程中运行时速度不会更快。第一个结果的可用性不会改变。你是对的,霍尔格先生,我没有想到这一点……这是我一直在想的,但我只是意识到,正如霍尔格所说,一旦我启动新线程,函数将等待直到它返回,所以这不会使它更快。。。
private final ExecutorService pool = Executors.newFixedThreadPool(10);

public Future<Boolean> isWaning(final Moon moon) throws IOException {
  return pool.submit(new Callable<Boolean>() {
    @Override
    public Boolean call() throws Exception {
      return moon.isWaning();
    }

  }
  );
}

public Future<Boolean> fullMoonFollowing(final Moon moon) throws IOException {
  return pool.submit(new Callable<Boolean>() {
    @Override
    public Boolean call() throws Exception {
      return MoonPhaseFinder.findFullMoonFollowing(Calendar.getInstance());
    }

  }
  );
}

public Future<Boolean> newMoonFollowing(final Moon moon) throws IOException {
  return pool.submit(new Callable<Boolean>() {
    @Override
    public Boolean call() throws Exception {
      return MoonPhaseFinder.findNewMoonFollowing(Calendar.getInstance());
    }

  }
  );
}