Thread.sleep的Java多线程范围

时间:2015-03-10 07:26:30

标签: java multithreading concurrency scope sleep

根据Oracle的documentation for Thread.sleep

  

Thread.sleep导致当前线程暂停指定时间段的执行。

我想知道什么是当前的主题。

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

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

包含Function实例的类以及嵌套的SwingWorker和Function类:

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将显示一个窗口并执行SwingWorker,该SwingWorker驱动一个解释基本语言的编译代码的虚拟机。将会有更长的函数列表,以及告诉虚拟机调用哪些函数的指令列表。 根据用户的输入,WrapSleep.run()可以跟随任意数量的WrapPrint.run()调用。据我所知,VM在正确解释用户代码方面应该起到应有的作用。


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


由于WrapSleep的实例不是MyWorker的成员并且它没有被线程初始化,因此在MyWorker中调用WrapSleep.run()只能作为回调函数并且只导致线程WrapSleep被初始化为sleep吗? - 允许MyWorker.doInBackground()完成而不会暂停

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

2 个答案:

答案 0 :(得分:3)

&#39;当前主题&#39;是那个正在呼叫Thread.sleep().

的人

没有神秘感。

  

或者我的假设不正确,函数初始化的线程正在休眠?

是的,这是不正确的。

答案 1 :(得分:-1)

EJP的回答是正确的,但请注意,无论如何,您的整个程序和GUI功能都会在您的代码中存在。必须使用Runnable实现类才能使其成为新的Thread。要执行此新线程,您需要使用

new Thread(new MyClass()).start;

MyClass看起来像这样:

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