有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

单线程java中的多线程多可运行

我试图有一堆可运行的线程,可以一次启动一个。 差不多

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

    }
});

我想做的事不可能吗


共 (6) 个答案

  1. # 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()方法可以检查外部变量以确定操作的选择。这是否有意义(以及是否更好)取决于您的应用程序

  2. # 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();
                    }
                });
            }
        }
    
  3. # 4 楼答案

    i want to have several runnables in one thread. they will be doing different things at different times.

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

    如果您正在谈论重新使用相同的背景线程来做不同的事情,那么我将使用单个线程池,如@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。如果需要共享某些状态,它们可以接受构造函数参数

  4. # 5 楼答案

    您可以使用单线程执行器

    ExecutorService service = Executors.newSingleThreadedPool();
    
    service.submit(runnable1);
    service.submit(runnable2);
    service.submit(runnable3);
    
  5. # 6 楼答案

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

    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,当它被finished时,它将执行第二个Runnable


    或泛化为更易于运行的:

    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();
        }
    }