大佬们,我一个类中有两个方法a和b,a有返回值,b没有返回值。我要如何做才能够在调用a方法的期间同时执行b方法,前提是b的执行速度不能够影响到a方法的执行速度,他们两者毫无相关。
我做这个的场景是想在做一个操作1的过程中,提前将另外一个操作2放入缓存中,待操作1完成,就可以立即从操作2缓存中拿去数据,提高速度。
请问这样需要用到什么技术,多线程的并行?还是有其他的。(因为现在只是构思阶段,没有代码给到大佬看,请见谅!)
大佬们,我一个类中有两个方法a和b,a有返回值,b没有返回值。我要如何做才能够在调用a方法的期间同时执行b方法,前提是b的执行速度不能够影响到a方法的执行速度,他们两者毫无相关。
我做这个的场景是想在做一个操作1的过程中,提前将另外一个操作2放入缓存中,待操作1完成,就可以立即从操作2缓存中拿去数据,提高速度。
请问这样需要用到什么技术,多线程的并行?还是有其他的。(因为现在只是构思阶段,没有代码给到大佬看,请见谅!)
基本的多线程 + 同步,就可以完成。
给你写了一个,demo。不知道是不是你要的。使用CompletableFuture
实现。
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.TimeUnit;
public class Main {
public static void main(String[] args) throws Exception {
// 异步执行方法1,和方法2。一共耗时2秒,返回方法1的运行结果。
System.out.println("最终结果:" + func());
}
public static String func() throws Exception {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
CompletableFuture<String> f1 = CompletableFuture.supplyAsync(() -> {
System.out.println("func1执行:" + LocalTime.now().format(formatter));
String ret = func1();
System.out.println("func1结束:" + LocalTime.now().format(formatter));
return ret;
});
CompletableFuture<Void> f2 = CompletableFuture.runAsync(() -> {
System.out.println("func2执行:" + LocalTime.now().format(formatter));
func2();
System.out.println("func2结束:" + LocalTime.now().format(formatter));
});
// 异步执行2个方法
CompletableFuture.allOf(f1, f2)
// 阻塞,直到所有方法都执行完毕
.get();
// 返回方法1的执行结果
return f1.get();
}
// 方法1,耗时1秒
public static String func1() {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "success";
}
// 方法2,耗时2秒
public static void func2() {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
这一段是不是意味着只有等两个方法都执行完了,f1才能有返回值?举个例子:func1执行需要10秒,func2执行需要20秒,也就是说需要等到20秒后func1才能返回success?
有没有办法就是在10秒后func1就直接返回success。func2继续执行,等到20秒后func2也执行完毕!
那你根本就不用管func2。func1先执行,func2后异步执行。func1执行完毕直接返回就是了。