1

これらのクラスがあり、コメントを読んでいるとします。

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 
}
}

また、両方のメソッドを呼び出すかどうかを決定するためにコンストラクターを使用したくありません

4

3 に答える 3

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

    }
}

このように、両方のメソッドは同じスレッドによって順番に実行されますが、別々に実行されます。

于 2012-04-29T15:37:15.300 に答える
0

クラスにパラメータを追加します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));
于 2012-04-29T15:38:21.077 に答える
0

匿名クラスを使用できます。

final boolean condition = ...
Thread t = new Thread(new Runnable() {
  public void run() {
    Work work=new Work();
    work.doWork();
    if(condition)
       work.commit();
}});
t.start();
于 2012-04-29T15:42:03.767 に答える