从另一个类调用一个扩展Thread的类的方法

时间:2016-06-07 05:53:32

标签: java multithreading

我知道这是一个有点幼稚的问题,但我想了解java中多线程背后的基本工作原理。考虑以下代码,并说A在主线程中执行,它开始执行另一个工作线程,在B类中定义。我想知道可以从A调用B.func1并运行B的方法,并行执行或不执行?

public class A {
    public static void main(String[] args) {
        B obj = new B();
        obj.start();
        obj.func1();
    }
}

public class B extends Thread {
    public B() {
        //constructor
    }
    public void run() {
        while(true) {
            //do somethings
        }
    }
    public void func1() {
        //do someotherthings
    }
}

3 个答案:

答案 0 :(得分:5)

方法调用背后没有魔力。如果从线程调用方法,则在完全相同的线程中调用它。因此,从obj.func1()调用main,它将在主线程中运行。它属于哪个类或者它是否扩展Thread并不重要。

新线程首先执行run。从run等调用的所有内容都将与main并行执行。

答案 1 :(得分:1)

您的代码存在多个问题。我更正了它们并添加了一个语句来在func1()中打印线程名称。

工作代码:

public class A {
    public static void main(String args[]){
        B obj = new B();
        obj.start();
        obj.func1();
    }
}

class B extends Thread{
    public B (){
        //constructor
    }
    public void run(){
        while(true){
            //do somethings
        }
    }
    public void func1 (){
        //do someotherthings
        System.out.println("Thread name="+Thread.currentThread().getName());
    }
}

输出:

Thread name=main

由于您直接从main方法(A.java)调用func1(),因此输出中将获得Thread name = main

如果添加相同的print语句run()方法,您将获得输出:Thread name=Thread-0

答案 2 :(得分:1)

理解线程Yii::$app->runAction()之间的区别非常重要。

线程是您的代码的独立执行。通常当我们谈论某个方法或其他方法如何工作时,我们会说“它测试变量Thread,如果x小于零,它会调用x方法... “

好的,那句话中的“它”是什么? 不是方法。方法不任何事情。一个方法只是一个指令列表,比如有人留给他们的室友执行的家务清单。这个清单不做家务,而是做室内工作的室友(或许我们希望如此)。

“it”是线程。线程是操作系统中执行方法的实体(即,他们做家务)。

另一方面,foobar是一个Java对象,您的程序可以使用它来创建和管理新的线程。您的程序通过执行以下操作创建新的Thread对象:

Thread

[糟糕!看看我刚才做了什么?它不是你的程序,它可以完成工作,它是你程序的主线程,或者你程序中的其他一些线程。这是一件容易忘记的事情!]

无论如何,它随后通过调用thread t = new Thread(...);

创建新的线程

一旦你理解了这一切,那么Sergey Tachenov的回答就变得很明显了:调用t.start();对象的方法与调用任何其他类型对象的方法没有什么不同。