通过将函数移动到自己的线程来加速java代码
调用'Moon m=new Moon();'时,最下面的代码会变慢;。 为了解决这个问题,我想将下面的代码放在一个线程或其他东西中,以便moonCalTimer更快地退出并将值返回给其他函数。你知道怎么把它放在一条线或类似的东西里吗通过将函数移动到自己的线程来加速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();
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());
}
}
);
}