在Java中使用多线程调用同一类的不同方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Java中使用多线程调用同一类的不同方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2509字,纯文字阅读大概需要4分钟。
内容图文
![在Java中使用多线程调用同一类的不同方法](/upload/InfoBanner/zyjiaocheng/682/41c6f0cc5d7d4e8796df7db1082d705d.jpg)
我有以下三种方法的课程
public class MyRunnable implements Runnable {
@Override
public void run() {
// what code need to write here
//to call the specific methods based on request types
}
public int add(int a, int b){
return a+b;
}
public int multiply(int a , int b){
return a*b;
}
public int division(int a , int b){
return a/b;
}
}
和我的主要班级一样
在这里r.multiply(),add()和divide()方法将按顺序执行,但是我想以多线程方式执行它们,因此我可以更快地得到结果.如何基于输入动态调用类的方法.如何传递给线程以及如何将结果从线程返回给调用线程.
public class ThreadDemo {
public static void main(String[] args) {
MyRunnable r = new MyRunnable();
// how to do below calculation using multihtreading
// how to call a method and how to get result of a thread of same class
int result = r.multiply(1, 2) + r.add(4, 5) + r.division(10, 5);
System.out.println(result);
int newResult = r.add(20, 50);
System.out.println(newResult);
}
}
解决方法:
多线程将减慢该应用程序的速度(因为每个步骤的处理量很小,不足以证明在线程间分配工作的开销是合理的),因此该应用程序可能在您始终感觉良好之前就已经完成了.
假设这是一个简化的示例,您可以编写
MyRunnable r = new MyRunnable();
Executor exec = Executors.newFixedThreadPool(3);
CompletableFuture<Integer> mult = CompletableFuture.runAsync(() -> r.multiply(1, 2),exec );
CompletableFuture<Integer> add = CompletableFuture.runAsync(() -> r.add(4, 5) ,exec);
CompletableFuture<Integer> div = CompletableFuture.runAsync(() -> r.division(10, 5),exec);
CompletableFuture<Integer> result = mult.thenCombine(add, (multRes,addRes) -> multRes+addRest)
.thenCombine(div, (total,divRes) -> total+divRes);
int answer = result.join();
更新为什么使用显式定义的执行器?
>向读者展示如何显式定义执行程序(替代方法很简单)
>通过将Executor定义为变量,可以通过仅更改变量分配(不必重构所有方法)在Common ForkJoinPool(或任何其他执行程序类型)之间切换.例如.
//ForkJoinPool common
Executor exec = ForkJoinPool.commonPool();
//Expanding thread pool
Executor exec = Executors.newCachedThreadPool();
//Just execute on the current thread
Executor exec = (Runnable r) -> r.run();
>默认情况下为CompletableFuture.*异步方法共享公共ForkJoinPool,并行流以及不带特定执行器的ForkJoinTasks也是如此.除非团队的所有成员仔细考虑何时/不使用Common ForkJoinPool,否则最终可能会意外地将异步I / O操作与CPU绑定处理混入同一池中.
>同样,默认情况下,并行度设置为Runtime.getRuntime().availableProcessors()-1.这再次可能会或可能不会适合当前的使用情况(对于某些用户而言,这可能意味着该示例是单线程的).如果需要更改默认值,则可以通过系统属性“ java.util.concurrent.ForkJoinPool.common.parallelism”进行配置.
内容总结
以上是互联网集市为您收集整理的在Java中使用多线程调用同一类的不同方法全部内容,希望文章能够帮你解决在Java中使用多线程调用同一类的不同方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。