可使用参数运行?

2022-08-31 06:21:41

我需要一个“接受参数的Runnable”,尽管我知道这样的runnable并不存在。

这可能表明我的应用程序设计中的根本缺陷和/或我疲惫的大脑中的心理障碍,所以我希望在这里找到一些关于如何在不违反基本OO原则的情况下完成类似以下事情的建议:

  private Runnable mOneShotTask = new Runnable(String str) {
    public void run(String str) {
       someFunc(str);
    }
  };  

任何想法如何完成上述事情?


答案 1

好吧,自从我最初发布这个以来已经快9年了,说实话,Java从那时起已经做了一些改进。我将在下面留下我的原始答案,但人们没有必要做其中的内容。9年前,在代码审查期间,我会质疑他们为什么这样做,也许批准了,也许没有。有了现代lambdas,有这样一个投票率很高的答案来推荐一种过时的方法是不负责任的(平心而论,一开始是可疑的......)在现代Java中,代码审查将立即被拒绝,这将被建议:

void foo(final String str) {
    Thread t = new Thread(() -> someFunc(str));
    t.start();
}

和以前一样,以有意义的方式处理该线程等细节留给读者作为练习。但坦率地说,如果你害怕使用lambdas,你应该更害怕多线程系统。

原始答案,只是因为:

您可以在方法中声明一个类

void Foo(String str) {
    class OneShotTask implements Runnable {
        String str;
        OneShotTask(String s) { str = s; }
        public void run() {
            someFunc(str);
        }
    }
    Thread t = new Thread(new OneShotTask(str));
    t.start();
}

答案 2

你可以把它放在一个函数中。

String paramStr = "a parameter";
Runnable myRunnable = createRunnable(paramStr);

private Runnable createRunnable(final String paramStr){

    Runnable aRunnable = new Runnable(){
        public void run(){
            someFunc(paramStr);
        }
    };

    return aRunnable;

}

(当我使用它时,我的参数是一个整数ID,我用它来制作ID的哈希映射 - >myRunnables。这样,我可以使用哈希映射在处理程序中发布/删除不同的myRunnable对象。


推荐