Java 如果线程只能访问由不同线程创建的具有自己实例的类的静态方法,那么该类将在哪个线程上执行?

Java 如果线程只能访问由不同线程创建的具有自己实例的类的静态方法,那么该类将在哪个线程上执行?,java,android,multithreading,runnable,ui-thread,Java,Android,Multithreading,Runnable,Ui Thread,假设我有一个包含两个公共静态方法的类,它们控制它自身的一个私有实例。该课程的基本结构如下: public class MyClass { private static MyClass myclass = null; private final Process, OutputStreamWriter, Strings, ints, etc.... private class constructor.... private class methods....

假设我有一个包含两个公共静态方法的类,它们控制它自身的一个私有实例。该课程的基本结构如下:

public class MyClass {
    private static MyClass myclass = null;
    private final Process, OutputStreamWriter, Strings, ints, etc....
    private class constructor....    
    private class methods....  
        
    public static void command(String cmd) {
        if(myclass == null) {
            myclass = new MyClass();
        }
        myclass.setCmd(cmd);
    }
    
    public static void execute() {
        myclass.run();
        myclass.close();
    }
}
我在一个android应用程序中使用它,我只是想在深入设计之前验证一下它是如何工作的。假设该类的命令来自UI线程。UI线程调用第一个静态方法

MyClass.command("parse and do what's in this string");
现在,我预计在某些情况下,MyClass.execute()调用可能需要将近一秒钟的时间才能完成。我基本上只是想验证,如果我从服务或Runnable调用MyClass.execute()方法,执行将在该线程上进行

在后selig中,声明:

java中的内存分为两类:堆和堆栈。堆是所有对象所在的地方,堆栈是线程工作的地方。每个线程都有自己的堆栈,不能访问彼此的堆栈。每个线程还有一个指向代码的指针,该指针指向它们当前正在运行的代码位

当线程开始运行新方法时,会将该方法中的参数和局部变量保存在自己的堆栈上。其中一些值可能是指向堆上对象的指针。如果两个线程同时运行同一个方法,那么它们的代码指针都指向该方法,并且在堆栈上都有自己的参数和局部变量副本

既然UI线程调用了静态方法MyClass.command(“DoThis”),该方法在技术上实例化了该类的私有局部参数和变量,这是否意味着该类位于UI线程的堆栈上???这意味着,如果我从服务线程或可运行线程调用MyClass.execute(),那么当服务或可运行线程在UI线程上等待时,实际执行会发生在UI线程上?我对这一点的理解正确吗


谢谢大家!

好吧,你的帖子里有很多错误信息

1) 默认情况下,服务和可运行程序没有自己的线程。服务在UI线程上运行,尽管它们可以创建线程(默认情况下,IntentService将创建线程)。Runnables运行在任何线程调用上。但是,除非您将它们发布到附加到另一个线程或线程对象的处理程序,否则它们不会启动新的处理程序

2) 所有Java对象都在堆上,而不是堆栈上。堆栈只保存基本类型和对对象的引用(但对象本身在堆上)

3) 是的,每个线程都有自己的堆栈,因此它可以有自己的局部变量集。但这并不能阻止它接触堆上的任何东西。它包括程序中的任何对象

4) 线程唯一私有的东西是函数中的局部变量。请注意,任何本地对象仍在堆上,可以保存对它的引用并将其传递给另一个线程


5) 绝对没有任何东西限制线程只调用静态方法。您可以调用任何类型的方法。

好的,您的帖子中有很多错误信息

1) 默认情况下,服务和可运行程序没有自己的线程。服务在UI线程上运行,尽管它们可以创建线程(默认情况下,IntentService将创建线程)。Runnables运行在任何线程调用上。但是,除非您将它们发布到附加到另一个线程或线程对象的处理程序,否则它们不会启动新的处理程序

2) 所有Java对象都在堆上,而不是堆栈上。堆栈只保存基本类型和对对象的引用(但对象本身在堆上)

3) 是的,每个线程都有自己的堆栈,因此它可以有自己的局部变量集。但这并不能阻止它接触堆上的任何东西。它包括程序中的任何对象

4) 线程唯一私有的东西是函数中的局部变量。请注意,任何本地对象仍在堆上,可以保存对它的引用并将其传递给另一个线程


5) 绝对没有任何东西限制线程只调用静态方法。您可以调用任何类型的方法。

类不在堆栈上。线程和类之间没有交互

如果调用一个方法(包括
MyClass.execute()
),该方法将与其调用方在同一线程上运行。因此,如果您从服务调用它,它将在服务的线程中运行(但请注意,这也可能是UI线程,除非您让服务在单独的线程中运行!)。如果您从某个随机线程调用它,它将在该线程上运行


堆栈对于理解Java代码的功能实际上并不重要。

类不位于堆栈上。线程和类之间没有交互

如果调用一个方法(包括
MyClass.execute()
),该方法将与其调用方在同一线程上运行。因此,如果您从服务调用它,它将在服务的线程中运行(但请注意,这也可能是UI线程,除非您让服务在单独的线程中运行!)。如果您从某个随机线程调用它,它将在该线程上运行

堆栈对于理解Java代码的功能实际上并不重要

这是否意味着该类位于UI线程的堆栈上

你把引用和对象搞混了

在Java中,对象总是在堆上。每个线程在自己的堆栈中都有自己的对象引用副本。因此,
command()
所做的任何更改都将影响引用位于堆栈上的对象——引用本身以及堆栈上的所有其他值都将保持不变,因为被更改的实体位于堆上

这意味着,如果我从服务线程或可运行线程调用MyClass.execute(),则