Java Thread.sleep 的多线程范围

Java multi-threading scope of Thread.sleep

根据 Oracle 的 documentation for Thread.sleep:

Thread.sleep causes the current thread to suspend execution for a specified period.

我想知道什么是当前线程。

我有一个名为 Function 的简单接口:

public interface Function {
    public abstract void run(TomVM vm);
}

还有一个 class,它包含 Function 的实例以及嵌套的 SwingWorker 和 Function class:

public class MyApp{
    //Function that will be called by a SwingWorker
    Function myFunction;
    //Worker thread that will call the run() member of Functions
    MyWorker myWorker;


    public void start(){
        //Initialize functions
        myFunction = new WrapSleep();   //Object that calls sleep

        //Start worker thread
        myWorker = new MyWorker();
        myWorker.execute();

    }

    private class MyWorker extends SwingWorker<Object, Object>{

        @Override
        protected Object doInBackground() throws Exception {
            //There would normally be a loop here to call
            //run for a list of Functions

            //Have an arbitrary Function object run
            myFunction.run(); //In this case WrapSleep.run()

        }

    }

    //Sleep for a period of time
    public final class WrapSleep implements Function {
        public void run() {
            try {
                Thread.sleep(5000)
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    //Display a message
    public final class WrapPrint implements Function{

        @Override
        public void run() {
            JOptionPane.showMessageDialog(null, "Hello World");
        }   
    }   
}

在实际应用中,MyApp会显示一个window并执行SwingWorker,它驱动一个解释基本语言编译代码的虚拟机。将会有更长的函数列表,以及告诉虚拟机调用哪些函数的指令列表。 根据用户的输入,WrapSleep.run() 之后可能会跟有任意数量的 WrapPrint.run() 调用。据我所知,虚拟机在正确解释用户代码方面发挥着应有的作用。


我遇到的问题是,当调用 WrapSleep.run() 时,应用程序的行为就像 VM 已成功完成一样,而不显示通常由 WrapPrint.run() 显示的消息或不暂停延长时间。


由于 WrapSleep 的实例不是 MyWorker 的成员并且它不是由线程初始化的,因此在 MyWorker 中调用 WrapSleep.run() 仅作为回调函数并且仅导致线程 WrapSleep 在中初始化睡觉? - 允许 MyWorker.doInBackground() 在不暂停的情况下完成

我希望 SwingWorker 没有 Function 成员,但是我需要在什么范围内定义 Functions 列表,以便 Thread.sleep() 使 SwingWorker 正常休眠?或者我的假设不正确,函数初始化的线程正在休眠?

'current thread' 是调用 Thread.sleep().

的那个

没有神秘感。

Or is my assumption incorrect that the thread where the function is initialized is sleeping?

是的,这是不正确的。

EJP 的回答是正确的,但请注意,无论如何,您的整个程序和 GUI 功能都将在您的代码中休眠。一个 class 必须用 Runnable 实现才能使它成为一个新的线程。要执行这个新线程,您要使用

new Thread(new MyClass()).start;

MyClass 看起来像这样:

public class MyClass implements Runnable {
     @Override
     public void run() {
     // Some Code
     Thread.sleep(500);
     }