Java:在'Runnable'类中私下调用'run'

Arj*_*kar 3 java multithreading

我正在编写一个涉及多线程工作池的Java程序Process.该类的每个实例都Process需要能够生成一个额外的线程来完成一些工作.但是线程应该由实例本身和其他人产生.不幸的Runnable.run是'公开'所以如果不做一些技巧我就无法真正强制执行.

这是我计划使用的技巧:

  1. 实施RunnableProcess
  2. 将此写入实现:

码:

 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 Code Online (Sandbox Code Playgroud)

当然,现在我需要做的就是run合法地在打电话之前打开'threadkey'(私有).

优雅?或不?或者,还有更好的方法?或者我应该不打扰执行此并写一个简洁的小评论解释不要打电话'跑'?

人们甚至会在需要做"跑步"的班级内打电话给"跑"吗?

tem*_*def 11

虽然你认为a的run方法Runnable是公共的是正确的,但是你可以做的一件事就是阻止其他人调用它是使你的整个Runnable实现成为一个包私有类或私有内部类.这样,虽然它可能有一个public run方法,但是自定义类以外的代码无法实例化该Runnable对象.如果您的类也没有回复对它的引用,那么客户端将无法访问它Runnable,因此它们无法调用run.也就是说,没有你的Process班级实施Runnable; 相反,创建另一个实际实现的类Runnable,然后创建Process唯一可以访问它的类.

这种方法比你提出的方法更优雅,因为它阻止其他代码run在编译时而不是在运行时调用.特别是,如果任何代码试图调用run上面描述的方法,它将编译得很好,并将在运行时失败.问题是代码将编译但无法正常工作.使Runnable无法访问意味着如果有人试图运行它,他们将得到编译时错误,并将不得不重新考虑他们的设计.换句话说,编译器会在错误发生之前检测到错误.

通常,如果您发现自己想要阻止随机代码调用必须公开的类的方法,因为它们是在接口中声明的,请考虑更改整个类的访问说明符,以便客户端无法引用它.


Alb*_*Alb 7

你可以使用这样的匿名内部类Runnable:

private void spawnThread() {
    Thread t = new Thread( new Runnable(){
          public void run(){
             // do something
          }
    }
    t.start();
}
Run Code Online (Sandbox Code Playgroud)

并且spawnThread()只能从类中调用,因为它是私有的.