除了将 Runnable 传递给 Thread 的构造函数之外,它还用在哪里?

Where is Runnable used apart from passing it to Thread's constructor?

我试图理解 Sonar 规则 squid:S1217,其中提到调用 Thread.run() 和 Runnable.run() 方法是一种不好的做法。我想知道可以使用Runnable.run()的场景。

与其直接实例化 Threads,不如依赖 ExecutorServices(参见 Executor Interfaces in the Java tutorial). These take Runnables as parameters in some of their methods

示例:

ExecutorService executorService = Executors.newFixedThreadPool(10);

executorService.execute(new Runnable() {
    public void run() {
        System.out.println("Asynchronous task");
    }
});

// alternative Java 8 lambda syntax:
executorService.execute(() -> System.out.println("Asynchronous task"));

executorService.shutdown();

如果您直接调用 Thread.run() 或 Runnable.run() 它将作为一个简单的方法,因此您的程序中没有多线程行为。而这个方法在内部由负责多线程的 start() 方法调用。