将runnable传递给线程-Java
我试图在三种将runnable传递给线程-Java,java,multithreading,Java,Multithreading,我试图在三种线程中运行Runnable对象。Swing EDT,当前线程(创建对象的线程)和主线程 到目前为止,我已经迈出了这一步: public class MyExecutor implements Executor { public final static int SWING_MAIN_THREAD = 0; public final static int MAIN_THREAD = 1; public final static int RUNNING_THRE
线程中运行Runnable
对象。Swing EDT
,当前线程
(创建对象的线程)和主线程
到目前为止,我已经迈出了这一步:
public class MyExecutor implements Executor {
public final static int SWING_MAIN_THREAD = 0;
public final static int MAIN_THREAD = 1;
public final static int RUNNING_THREAD = 2;
private int threadType = -1;
public MyExecutor (int threadType) {
this.threadType = threadType;
}
@Override
public void execute(Runnable runnable) {
switch(threadType) {
case SWING_MAIN_THREAD:
SwingUtilities.invokeLater(runnable);
break;
case MAIN_THREAD:
// pass the runnable to the main thread
// if main thread is the EDT, pass the runnable to the EDT
// if main thread is a "normal" thread, pass the runnable to it
break;
case RUNNING_THREAD:
// pass the runnable to the thread that created this object
break;
}
}
现在我被困在MainThread
和RunningThread
案例中,因为我找不到将runnable
对象传递给相应的线程的方法。我知道如何获取线程
,但我看不到任何方法可以将可运行
对象传递给它。您不能将对象传递给“创建此对象的线程”,但可以将其传递给调用execute()方法的线程,这将是当前运行线程的正常定义
case RUNNING_THREAD:
// pass the runnable to the thread that created this object
runnable.run();
break;
“主”线程在Java中不作为一个概念存在,很抱歉,您不能这样做。(我的意思是,主线程不是专门存储的,因此您可以访问它。当然有一个主启动线程,但它并不特殊。)您不能将对象传递给“创建此对象的线程”,但可以将其传递给调用execute()方法的线程,这将是当前运行线程的正常定义
case RUNNING_THREAD:
// pass the runnable to the thread that created this object
runnable.run();
break;
“主”线程在Java中不作为一个概念存在,很抱歉,您不能这样做。(我的意思是,主线程不是专门存储的,因此您可以访问它。当然,有一个主启动线程,但它并不特殊。)您可以使用SwingUtilities的主要原因。invokeLater
是EDT有一个任务队列,它的处理循环从中挑选并运行任务,而invokeLater
只是将给定的任务发布到该队列
但是,大多数线程没有处理循环或任务队列,因此不能将任务发布到任意线程。当然,你可以为你的线程编写这样一个循环。你可以使用SwingUtilities.invokeLater
的主要原因是EDT有一个任务队列,它的处理循环从中挑选并运行任务,而invokeLater
只是将给定的任务发布到该队列
但是,大多数线程没有处理循环或任务队列,因此不能将任务发布到任意线程。当然,您可以为线程编写这样一个循环。您可以在线程构造函数中传递它。@GregS但是线程已经在运行了。。。这就是问题所在“主线”是什么?真的没有。您是指当前正在执行的线程吗?@markspace我是指启动时创建的第一个线程。启动程序/软件的线程。确定,请参阅下文。没有存储“主”线程,因此您可以使用它。不存在。请在线程构造函数中传递它。@GregS,但线程已在运行。。。这就是问题所在“主线”是什么?真的没有。您是指当前正在执行的线程吗?@markspace我是指启动时创建的第一个线程。启动程序/软件的线程。确定,请参阅下文。没有存储“主”线程,因此您可以使用它。不存在。请参见上文。你没有特别的权限访问它。系统不会存储它,因此您可以稍后使用它。它只是一个正常运行的线程,与所有其他线程一样。我认为在“主线程”中,他指的是jvm创建的用于启动应用程序的线程。如果该线程遇到错误或只是退出怎么办?@Marcacierno是的,markspace知道这一点。但是,仍然没有用于获取该线程的特殊访问器。除非您要做的是遍历所有线程并查找一个名为main
。但是任何Tom、Dick和Harry都可以创建一个名为main
的线程。正如我在评论中所说,他可以将它保存在main方法内的变量中。我并不是说这是一件好事,因为他想做的事情在“标准”线程中是不可能的,这就是为什么我对你的答案投了赞成票:)见上文。你没有特别的权限访问它。系统不会存储它,因此您可以稍后使用它。它只是一个正常运行的线程,与所有其他线程一样。我认为在“主线程”中,他指的是jvm创建的用于启动应用程序的线程。如果该线程遇到错误或只是退出怎么办?@Marcacierno是的,markspace知道这一点。但是,仍然没有用于获取该线程的特殊访问器。除非您要做的是遍历所有线程并查找一个名为main
。但是任何Tom、Dick和Harry都可以创建一个名为main
的线程。正如我在评论中所说,他可以将它保存在main方法内的变量中。我并不是说这是一件好事,因为他想做的事情在“标准”线程中是不可能的,这就是为什么我对你的答案投了赞成票:)