我正在编写一个涉及 Process
es 的多线程工作池的 Java 程序。 Process
类的每个实例都需要能够产生一个额外的线程来完成一些工作。但是线程应该由实例本身而不是其他人产生。不幸的是 Runnable.run
是“公开的”,所以如果不做一些技巧,我就无法真正执行这一点。
这是我计划使用的技巧:
Runnable
Process
代码:
class Process implements Runnable {
private boolean threadkey = false;
public void run() {
synchronized(threadkey) {
// is someone wrongly calling 'run'?
if(!threadkey)
return;
/* switch off threadkey to make sure
it cannot be called meaningfully again */
threadkey = false;
}
/* continue processing
*
*/
return;
}
当然,现在当我想合法地使用
run
时,我需要做的就是在调用之前打开“threadkey”(这是私有(private)的)。优雅的?或不?或者,还有更好的方法?或者我应该不去强制执行这个并写一个简洁的小评论来解释不要调用“运行”?
人们甚至在需要进行“运行”的类(class)中调用“运行”吗?
最佳答案
虽然您认为 run
的 Runnable
方法是公开的,但您可以做的一件事是防止其他人调用它,使您的整个 Runnable
实现成为包私有(private)类或私有(private)内部类。这样,虽然它可能有 public
run
方法,但自定义类以外的代码无法实例化 Runnable
对象。如果您的类也没有返回对它的引用,那么客户端将无法访问 Runnable
,因此他们无法调用 run
。也就是说,不要让 Process
类实现 Runnable
;相反,创建另一个实际实现 Runnable
的类,然后使 Process
成为唯一可以访问它的类。
这种方法比您提出的方法更优雅,因为它可以防止其他代码在编译时而不是在运行时调用 run
。特别是,如果任何代码尝试调用上述 run
方法,它将很好地编译,并且会在运行时失败。问题是代码会编译但永远无法正常工作。使 Runnable
不可访问意味着如果有人尝试运行它,他们将得到一个编译时错误并且必须重新考虑他们的设计。换句话说,编译器会在错误发生之前检测到它。
一般而言,如果您发现自己想要防止随机代码调用必须公开的类的方法,因为它们是在接口(interface)中声明的,请考虑更改整个类的访问说明符,以便客户端无法引用它.
关于Java:在 'run' 类中私下调用 'Runnable',我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4909655/