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();
}
对不起,如果没有解释,请发表评论,如果您需要澄清.
谢谢!
那么你当然可以创建一个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)