Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从另一个类调用扩展线程的类的方法_Java_Multithreading - Fatal编程技术网

Java 从另一个类调用扩展线程的类的方法

Java 从另一个类调用扩展线程的类的方法,java,multithreading,Java,Multithreading,我知道这是一个有点幼稚的问题,但我想了解java多线程背后的基本工作原理。考虑下面的代码,并说A是在主线程中执行的,并且它开始在B类中定义的另一个工作线程的执行。我想知道,从B的和运行的方法调用的B.FROM1,是否并行执行? public class A { public static void main(String[] args) { B obj = new B(); obj.start(); obj.func1(); } }

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

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(),因此将在输出中获得
threadname=main


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

了解线程和
线程之间的区别很重要

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

好的,那句话中的“it”是什么?这不是方法。方法不起任何作用。方法只是一个指令列表,就像某人留给室友执行的家务清单一样。这份清单并没有做家务,而是由室友来做(或者我们希望如此)

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

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

thread t = new Thread(...);
[哎呀!看到我刚才做了什么吗?不是你的程序,而是你的程序的主线程,或者你程序中的其他线程。这很容易忘记!]

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



一旦你明白了这一切,然后Sergey Tachenov的答案变得显而易见:调用
线程的方法实际上与调用任何其他类型对象的方法没有什么不同。

刚刚意识到您已经更正了问题中的源代码本身:)@HovercraftFullOfEels共享字段应该正确同步,在某些情况下,使它们不稳定就足够了,但在其他情况下,这可能涉及其他同步mechanisms@HovercraftFullOfEels,依我看,你只会让noobs误入歧途,告诉他们同步方法。同步的唯一目的是保护数据。我们经常谈论同步一个方法的必要性,而我们真正的意思是我们需要同步一些由该方法独占访问的数据位。但更多情况下,相同的数据可以通过多种方法访问。noobs需要知道,除非访问共享数据的每一位代码都在同一个对象上进行了同步,否则同步的
synchronized
是不起作用的。@jameslarge:你说得对。删除评论,感谢您的澄清/更正。是否可以确定执行顺序?B类的run方法后面跟着B类的funct1方法,还是反过来?