我正在尝试拥有一堆可以一次启动的可运行线程。就像是
First(new Thread() {
public void run() {
//do something
}
});
我想做的事是不可能的吗?
我正在尝试拥有一堆可以一次启动的可运行线程。就像是
First(new Thread() {
public void run() {
//do something
}
});
我想做的事是不可能的吗?
您可以使用单线程执行器
ExecutorService service = Executors.newSingleThreadedPool();
service.submit(runnable1);
service.submit(runnable2);
service.submit(runnable3);
我想在一个线程中有多个可运行文件。他们会在不同的时间做不同的事情。
这对我来说听起来像是一个糟糕的设计。如果你的班级在不同的时间做不同的事情,那么它应该分成不同的班级。
如果您正在谈论重新使用相同的后台线程来做不同的事情,那么我会使用一个单线程池,如@Peter 的回答:
private ExecutorService threadPool = Executors.newSingleThreadedPool();
...
threadPool.submit(new First());
threadPool.submit(new Second());
threadPool.submit(new Third());
...
// when you are done submitting, always shutdown your pool
threadPool.shutdown();
、First
和Second
类Third
将实现Runnable
. 如果他们需要共享一些状态,他们可以接受构造函数参数。
是的,只有多个私有方法:
public class FirstCaller {
private void method1() { }
private void method2() { }
private void method3() { }
public void someMethod() {
First(new Thread() {
public void run() {
//do something
method1();
method2();
method3();
}
});
}
}
或者正如 Ted Hopp 指出的那样
public class FirstCaller {
public void someMethod() {
new First(new Thread() {
private void method1() { }
private void method2() { }
private void method3() { }
public void run() {
//do something
method1();
method2();
method3();
}
});
}
}
您是否尝试在单个线程中按顺序执行多个可运行文件?一个接一个地?
public class MultiRunnable implements Runnable {
private Runnable runnable1;
private Runnable runnable2;
public MultiRunnable(Runnable runnable1, Runnable runnable2) {
this.runnable1 = runnable1;
this.runnable2 = runnable2;
}
@Override
public void run() {
runnable1.run();
runnable2.run();
}
}
然后你可以打电话(new Thread(new MultiRunnable(... , ...))).start();
这将首先执行第一个 Runnable,完成后将执行第二个。
或推广到更多 Runnables:
import java.util.Arrays;
import java.util.List;
public class MultiRunnable implements Runnable {
private List<Runnable> runnables;
public MultiRunnable(Runnable... runnables) {
this.runnables = Arrays.asList(runnables);
}
public MultiRunnable(List<Runnable> runnables) {
this.runnables = runnables;
}
@Override
public void run() {
for(Runnable runnable : runnables)
runnable.run();
}
}
如果你想同时启动几个线程CountDownLatch
是你所需要的。在此处查看示例:http ://www.javamex.com/tutorials/threads/CountDownLatch.shtml 。
最简单的做法是定义几个Thread
子类实例并根据您要执行的操作调用适当的实例。
但是,如果您确实需要一个在不同情况下表现不同的单个Thread
对象,您可以定义一个Thread
具有状态变量的子类来控制它的作用。
class MyThread extends Thread {
public enum Action { A, B, C }
private Action mAction;
public void run() {
if (mAction == null) {
throw new IllegalStateException("Action must be specified");
}
switch (mAction) {
case A:
methodA();
break;
case B:
methodB();
break;
case C:
methodC();
break;
}
}
public void setAction(Action action) {
if (action == null) {
throw new IllegalArgumentException("Action cannot be null");
}
mAction = action;
}
private void methodA() { ... }
private void methodB() { ... }
private void methodC() { ... }
}
然后,您可以创建线程并在调用之前调用start()
,setAction
传递其中一个Action
值。
作为状态变量的替代方案,该run()
方法可以检查外部变量以确定动作的选择。这是否有意义(以及是否会更好)取决于您的应用程序。