有 Java 编程相关的问题?

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

java通过当前线程调用多个方法

假设我们有这些类并阅读注释

class Work {
void doWork(){  }
void commit(){}       
}
class MyRunable implements Runnable {
run(){
   Work  work=new Work();
   work.doWork();
//i can't write work.commit() here, because sometimes i want Thread runs both methods       
 //and sometimes runs only doWork()
 }
}
class Tasks{
main(){
MyRunable myRunable=new MyRunable();
Thread t=new Thread(myRunable);
t.start();
//suppose now i need to call commit() method by the same thread (t)
//how can i do that 
}
}

此外,我不想使用构造函数来确定是否要同时调用这两个方法


共 (3) 个答案

  1. # 1 楼答案

    您可以尝试将线程池与单个线程一起使用,并根据需要让方法排队:

    class Tasks {
        public static void main(String[] args) {            
    
            ExecutorService exec = Executors.newSingleThreadExecutor();
            final Work work = new Work();
            exec.submit(new Runnable() {
                    public void run() {
                        work.doWork();
                    }
                });
            // later
            exec.submit(new Runnable() {
                    public void run() {
                        work.commit();
                    }
                });
    
        }
    }
    

    这样,这两个方法将由同一个线程按顺序执行,但会分别执行

  2. # 2 楼答案

    你可以使用匿名类

    final boolean condition = ...
    Thread t = new Thread(new Runnable() {
      public void run() {
        Work work=new Work();
        work.doWork();
        if(condition)
           work.commit();
    }});
    t.start();
    
  3. # 3 楼答案

    将参数添加到类MyRunnable。将此参数称为“runingMode”。它可能是一个枚举:

    enum RunningMode {
        DO_WORK {
            public void work(Work work) {
                 work.doWork();
            }
        },
        COMMIT {
            public void work(Work work) {
                 work.commit();
            }
        };
        public abstract void work();
    }
    

    现在你的类MyRunnable应该有一个模式列表:

    class MyRunable implements Runnable {
        private Collection<RunningMode> modes;
        MyRunable(Collection<RunningMode> modes) {
             this.modes = modes;
        }
    }
    

    实现run()方法如下:

      Work  work=new Work();
      for (RunningMode mode : modes) {
            mode.work(work);
      }
      work.doWork();
    

    创建类的实例,并将当前需要的模式传递给它:

    MyRunable myRunable=new MyRunable(Arrays.asList(RunningMode.DO_WORK, RunningMode.COMMIT));