组合两个Runnable对象

use*_*041 2 java multithreading green-threads runnable

比方说,我有一个名为RunnableA的Runnable可以做某事.我还有一个名为RunnableB的Runnable,可以执行其他操作.有没有办法可以将这两个Runnables组合起来,以便它们可以在同一个线程中运行?

问题的第二部分是,如果这是可能的,那么我可以指定它们将运行的顺序吗?

编辑!:我之所以这样做是因为我需要在EDT上运行代码,但其他一些代码需要在另一个线程上运行.请看下面的代码.

像这样的东西


public final class CompoundRunnable implements Runnable
{
    private final Iterable runnables;

    public CompoundRunnable(Iterable runnables)
    {
        // From Guava. Easy enough to do by hand if necessary
        this.runnables = Lists.newArrayList(runnables);

    }

    public CompoundRunnable(Runnable... runnables)
    {
        this(Arrays.asList(runnables));
    }

    @Override
    public void run()
    {
        for (Runnable runnable : runnables)
        {
             runnable.run();
        }
    }
}


public void setStatusAndProgress(final String status,Runnable runnable)
    {
        Runnable startUpRunner = new Runnable()
        {
            public void run()
            {
                SwingUtilities.invokeLater(new Runnable()
                {
                    public void run()
                    {
                        setStatus(status);
                        selfReference.getProgressBar().setIndeterminate(true);
                    }

                });
            }
        };
        Runnable cleanUpRunner = new Runnable()
        {
            public void run()
            {
                SwingUtilities.invokeLater(new Runnable()
                {
                    public void run()
                    {
                        setStatus("");
                        getProgressBar().setIndeterminate(false);
                    }
                });
            }
        };

        Runnable theRunner = new CompoundRunnable(startUpRunner,runnable,cleanUpRunner);
        new Thread(theRunner).start();
    }

对不起,如果没有解释,请发表评论,如果您需要澄清.

谢谢!

Jon*_*eet 7

那么你当然可以创建一个Runnable只运行一个runnable然后另一个运行:

public final class CompoundRunnable implements Runnable
{
    private final Runnable first;
    private final Runnable second;

    public CompoundRunnable(Runnable first, Runnable second)
    {
        this.first = first;
        this.second = second;
    }

    @Override
    public void run()
    {
        first.run();
        second.run();
    }
}
Run Code Online (Sandbox Code Playgroud)

更一般地说,您可以将其Iterable<Runnable>复制所有Runnable引用,然后按顺序运行它们.例如:

public final class CompoundRunnable implements Runnable
{
    private final Iterable<Runnable> runnables;

    public CompoundRunnable(Iterable<Runnable> runnables)
    {
        // From Guava. Easy enough to do by hand if necessary
        this.runnables = Lists.newArrayList(runnables);
    }

    public CompoundRunnable(Runnable... runnables)
    {
        this(Arrays.asList(runnables));
    }

    @Override
    public void run()
    {
        for (Runnable runnable : runnables)
        {
             runnable.run();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @ user489041:泛型基本上是关于类型安全性 - 确保你不要尝试将String放入一个Integers列表中.我强烈建议您阅读它们. (3认同)