【问题标题】:how come Thread class called inside another class?如何在另一个类中调用 Thread 类?
【发布时间】:2014-12-31 06:36:31
【问题描述】:

是否可以在不实现 Runnable 接口或不扩展 Thread 类本身的情况下在另一个类中使用 Thread 类?

这是调用 Thread 上的 sleep 方法的代码。

public class SleepMessages {
    public static void main(String args[])
        throws InterruptedException {
        String importantInfo[] = {
            "Mares eat oats",
            "Does eat oats",
            "Little lambs eat ivy",
            "A kid will eat ivy too"
        };

        for (int i = 0;
             i < importantInfo.length;
             i++) {
            //Pause for 4 seconds
            Thread.sleep(4000);
            //Print a message
            System.out.println(importantInfo[i]);
        }
    }
}

【问题讨论】:

  • 您可以将Runnable 传递给它而不是实现它
  • 如果不想使用runnable/Thread类,可以使用linux的OS级别功能fork()
  • @BhargavModi 您可以如何使用它?在 Java 中?
  • @BhargavModi - 如果他使用 ProcessBuilder,它将不再被称为 MultiThreading :)

标签: java multithreading runnable


【解决方案1】:

是的,这是可能的,您的代码就是证明。您始终可以使用给定类的静态成员,而无需实例化该类。粗略地说,在 Java 中,每个类都是您不必实例化的对象,您可以在其上调用其静态方法。

你不能做的是创建一个有用的Thread 而不实现Runnable 接口或扩展Thread 类。 (您可以通过直接实例化Thread 类来创建Thread 而无需这样做,但这样的线程将没有用处。

【讨论】:

    【解决方案2】:

    您可以创建Thread 的实例,将Runnable 传递给它,而不是实现: (Java 8)

    Thread thread = new Thread(() -> {
           //code here
    });
    
    public class SleepMessages {
        public static void main(String args[]) throws InterruptedException {
            Thread thread = new Thread(new Runnable() {
                public void run() {
                    String importantInfo[] = {
                        "Mares eat oats",
                        "Does eat oats",
                        "Little lambs eat ivy",
                        "A kid will eat ivy too"
                    };
    
                    for (int i = 0; i < importantInfo.length; i++) {
                        //Pause for 4 seconds
                        Thread.sleep(4000);
                        //Print a message
                        System.out.println(importantInfo[i]);
                    }
                }
            });
    
            thread.start();
        }            
    }
    

    【讨论】:

    • 不知道你所说的“而不是实施”是什么意思。您示例中的 //code here 注释位于实现 Runnable 的 匿名内部类 的 run() 方法中。
    • @jameslarge 以为他指的是他的班级,而不是匿名班级。更好?
    【解决方案3】:

    sleep() 是类Thread 中的一个静态 方法。当您调用Thread.sleep() 时,将使用当前线程。所以,是的,在任何时候,一个正在执行的程序都应该至少有一个活动/正在运行的线程。调用Thread.sleep() 将使当前线程 休眠。在这里,您不是在创建新线程。您实际上正在使用 现有 线程。您需要扩展 Thread 类或为您的 Custom 类实现 Runnable 以 behave 作为 Thread。

    【讨论】:

    • 那么 Thread 类是在这里隐式传递的吗?如果是,那是否意味着每个 java 代码中都有 Thread 类?
    • @tadtab - 否。Thread 类没有隐式通过。事实上,Current Thread 被隐式使用了。检查Thread,sleep()
    • 我不确定我是否理解这个概念,但我读到了一些关于每个 java 应用程序至少有一个线程,这是主线程是什么意思?
    • @tadtab - 看,每个 java 应用程序都在自己的进程中运行,并带有自己的 JVM。每个进程必须至少有一个线程,称为 main 线程。这是应用程序启动后立即开始执行的线程。可以使用此线程创建和启动其他线程。所以当你创建一个线程时,比如说使用-new Thread(new Runnable..,主线程会创建一个新线程。
    • “好的,所以要拥有一个主线程,该类必须先实现 Ruunable 或扩展 Thread 类。对吗?” @tadtab,也许吧。大多数 Java 虚拟机都是 C 程序,它们实现了称为 Java 本机接口 (JNI) 的东西。 JNI 允许 C 代码调用 Java 方法并创建新的 Java 线程。 Java 程序的主线程是通过 JNI 调用创建的,当一个线程以这种方式创建时,它总是会有一个Thread 对象,但它可以从任何类的任何方法开始。它不必从 Thread 对象的 run() 方法开始。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多