使用线程调用不同的方法

时间:2013-09-11 14:44:45

标签: java multithreading

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

我正在创建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()的逻辑?

请建议。

2 个答案:

答案 0 :(得分: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个扩展名不是这样。

  • 它在概念上更健全,因为Thread的子类化建议专门化其行为,而Runnable更像是“任务容器” - 赞成合成而不是继承。

  • 它是对称的 - 没有不同的计算方式,改变它是微不足道的。哪一个执行

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

答案 1 :(得分:1)

您必须调用run()方法中的方法。

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