根据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正常睡眠?或者我的假设不正确,函数初始化的线程正在休眠?
答案 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);
}