0

我想同时调用不同的类方法。

我正在创建 2 个类: Main- 这个 Function 和 Function 的实例化对象;这扩展了线程并有 2 种方法。

主.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();
    }
}

函数.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()类?

请建议。

4

2 回答 2

3

callingcalling2方法是同步的。synchronized关键字的本质是防止方法并发执行。因此,为了同时调用两者callingcalling2您需要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扩展不是这样。

  • 它在概念上更合理,因为子类化 aThread建议专门化它的行为,而Runnables 更像是“任务容器” - 有利于组合而不是继承。

  • 它是对称的 - 没有计算被不同地对待,改变例如哪个执行在哪里是微不足道的

最后,你似乎想从你的方法中返回一些东西。为此,您可以使用Future - 一个 java 并发实用程序类,代表异步计算。除了Runnable优点之外,它还可以返回一个值并提供取消和状态查询等功能。

于 2013-09-11T14:54:22.413 回答
1

您必须调用在 run() 方法中运行方法。

然后你可以调用 start() 方法,这两个方法都会运行。但这并不能真正解决问题。您需要做的是创建两个线程并让它们各自运行各自的线程。

于 2013-09-11T14:50:17.840 回答