繁体   English   中英

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

[英]Calling a method of a class which extends Thread, from another class

我知道这是一个有点天真的问题,但我想了解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
    }
}

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

新线程从执行run开始。 从run等调用的所有东西都将与main并行执行。

您的代码存在多个问题。 我更正了它们并添加了一个语句来在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

理解线程Thread之间的区别非常重要。

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

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

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

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

thread t = new Thread(...);

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

无论如何,它随后通过调用t.start();创建新线程 t.start();


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM