-1

我正在尝试拥有一堆可以一次启动的可运行线程。就像是

First(new Thread() {
    public void run() {
        //do something

    }
});

我想做的事是不可能的吗?

4

6 回答 6

9

您可以使用单线程执行器

ExecutorService service = Executors.newSingleThreadedPool();

service.submit(runnable1);
service.submit(runnable2);
service.submit(runnable3);
于 2012-09-23T19:29:40.837 回答
4

我想在一个线程中有多个可运行文件。他们会在不同的时间做不同的事情。

这对我来说听起来像是一个糟糕的设计。如果你的班级在不同的时间做不同的事情,那么它应该分成不同的班级。

如果您正在谈论重新使用相同的后台线程来做不同的事情,那么我会使用一个单线程池,如@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();

FirstSecondThird将实现Runnable. 如果他们需要共享一些状态,他们可以接受构造函数参数。

于 2012-09-25T20:12:53.407 回答
3

是的,只有多个私有方法:

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();
                }
            });
        }
    }
于 2012-09-23T18:35:17.523 回答
1

您是否尝试在单个线程中按顺序执行多个可运行文件?一个接一个地?

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();
    }
}
于 2012-09-23T18:53:53.983 回答
1

如果你想同时启动几个线程CountDownLatch是你所需要的。在此处查看示例:http ://www.javamex.com/tutorials/threads/CountDownLatch.shtml 。

于 2012-09-23T18:44:33.697 回答
1

最简单的做法是定义几个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()方法可以检查外部变量以确定动作的选择。这是否有意义(以及是否会更好)取决于您的应用程序。

于 2012-09-23T19:39:07.783 回答