将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方法内的变量中。我并不是说这是一件好事,因为他想做的事情在“标准”线程中是不可能的,这就是为什么我对你的答案投了赞成票:)