我想同时调用不同的类方法。
我正在创建2个类:Main-这个函数和函数的实例化对象;这扩展了线程并有两种方法。
Main.java
package ok;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Welcome to Threading");
Function f1 = new Function();
f1.start();
f1.calling();
f1.calling2();
}
}
Function.java
package ok;
public class Function extends Thread {
public void run() {
// TODO Auto-generated method stub
System.out.println("Run");
for(int y=140;y<170;y++){
System.out.println(y);
}
}
synchronized void calling(){
System.out.println("Let the game begin");
for(int y=40;y<70;y++) {
System.out.println(y);
}
}
synchronized void calling2(){
System.out.println("Let the game begin for me");
for(int y=0;y<40;y++) {
System.out.println(y);
}
}
}
如何让方法calling()
和calling2()
同时运作?
如果我启动一个线程,它将进入run()调用,并且没有任何返回类型。在我的程序中,我需要将返回值设为HashMap
。
我是否需要创建两个类来扩展线程并在这两个类的运行中编写calling()
,calling2()
的逻辑?
请建议。
答案 0 :(得分:3)
您的calling
和calling2
方法已同步。 synchronized
关键字的本质是阻止方法并发执行。因此,为了同时调用calling
和calling2
,您需要删除synchronized
关键字,至少从方法级别开始。
然后,要同时调用两个方法,一个Thread
对象就足够了 - 一个调用可以在新线程中执行,另一个调用可以在“当前”线程中执行,如下所示:
Thread thread = new MyThread();
thread.start(); // body of run() invoked in a new thread
thread.run(); // body of run() invoked in this thread, concurrently
不过,为这种用例生成单独的Runnable
对象是更好的做法。与前述方法相比,这有几个优点:
它更灵活 - 因为动作与执行分离并封装在一个单独的对象中,它变得更像“数据”。如果你觉得有必要改变计算策略 - 例如使用线程池 - 使用Runnable
任务执行此操作非常简单。 Thread
个扩展名不是这样。
它在概念上更健全,因为Thread
的子类化建议专门化其行为,而Runnable
更像是“任务容器” - 赞成合成而不是继承。
它是对称的 - 没有不同的计算方式,改变它是微不足道的。哪一个执行
最后,您似乎想从您的方法中返回一些内容。为此,您可以使用Future - 一个java并发实用程序类,表示异步计算。除了Runnable
优势之外,它还可以返回一个值并提供取消和状态查询等功能。
答案 1 :(得分:1)
您必须调用run()方法中的方法。
然后你可以调用start()方法,两个方法都会运行。但这并没有真正解决问题。您需要做的是创建两个线程,并让每个线程运行各自的线程。