Thread.sleep的Java多线程作用域
根据甲骨文的: Thread.sleep使当前线程在指定的时间段内暂停执行 我想知道什么是当前线程。 我有一个名为Function的简单接口:Thread.sleep的Java多线程作用域,java,multithreading,concurrency,scope,sleep,Java,Multithreading,Concurrency,Scope,Sleep,根据甲骨文的: Thread.sleep使当前线程在指定的时间段内暂停执行 我想知道什么是当前线程。 我有一个名为Function的简单接口: public interface Function { public abstract void run(TomVM vm); } 以及包含函数实例以及嵌套SwingWorker和函数类的类: public class MyApp{ //Function that will be called by a SwingWorker
public interface Function {
public abstract void run(TomVM vm);
}
以及包含函数实例以及嵌套SwingWorker和函数类的类:
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将调用的函数
函数myFunction;
//将调用函数的run()成员的工作线程
我的工人我的工人;
公开作废开始(){
//初始化函数
myFunction=new WrapSleep();//调用sleep的对象
//启动工作线程
myWorker=新的myWorker();
myWorker.execute();
}
私有类MyWorker扩展SwingWorker{
@凌驾
受保护对象doInBackground()引发异常{
//这里通常会有一个循环来调用
//运行函数列表
//运行任意函数对象
myFunction.run();//在本例中为WrapSleep.run()
}
}
//睡一段时间
公共final类WrapSleep实现函数{
公开募捐{
试一试{
线程。睡眠(5000)
}捕捉(中断异常e){
e、 printStackTrace();
}
}
}
//显示消息
公共final类WrapPrint实现函数{
@凌驾
公开募捐{
showMessageDialog(null,“Hello World”);
}
}
}
在实际的应用程序MyApp中,将显示一个窗口并执行SwingWorker,它驱动一个解释基本语言编译代码的虚拟机。将有更长的函数列表,以及告诉虚拟机要调用哪些函数的指令列表。
根据用户的输入,WrapSleep.run()后面可以跟任意数量的WrapPrint.run()调用。据我所知,VM在正确解释用户代码方面发挥了应有的作用
我遇到的问题是,当调用WrapSleep.run()时,应用程序的行为就像VM已成功完成一样,没有显示通常由WrapPrint.run()显示的消息,也没有暂停延长时间
由于WrapSleep实例不是MyWorker的成员,并且它不是由线程初始化的,因此在MyWorker中调用WrapSleep.run()是否仅起回调作用,并且只会导致线程WrapSleep在中初始化为睡眠?-允许MyWorker.doInBackground()在不暂停的情况下完成
我希望SwingWorker没有函数成员,但我需要在什么范围内定义函数列表,以便Thread.sleep()使SwingWorker正常睡眠?或者我的假设是不正确的,即初始化函数的线程正在休眠?当前线程是调用
thread.sleep()的线程。
不神秘
或者我的假设是错误的,即初始化函数的线程正在休眠
是的,它是不正确的。EJP的答案是正确的,但是请注意,不管怎样,整个程序和GUI功能都将在代码中休眠。类必须使用Runnable实现,才能使其成为新线程。要执行此新线程,您需要使用
new Thread(new MyClass()).start;
其中MyClass如下所示:
public class MyClass implements Runnable {
@Override
public void run() {
// Some Code
Thread.sleep(500);
}
在java中,每条语句都在一个线程中运行。默认情况下,在独立java程序中,它从主线程开始,您可以从主线程开始新线程。其中调用了thread
thread.sleep()
语句,该语句将睡眠。谢谢,我能够更好地缩小问题的范围