Java 除了将其传递给线程';谁的构造函数?
我试图理解Sonar规则,其中提到调用Thread.run()和Runnable.run()方法是一种不好的做法。我想知道可以使用Runnable.run()的场景。与其直接实例化线程,不如依赖ExecutorServices(参见Java教程中的内容)。它们将可运行项作为参数 例如:Java 除了将其传递给线程';谁的构造函数?,java,multithreading,java-8,sonarqube,runnable,Java,Multithreading,Java 8,Sonarqube,Runnable,我试图理解Sonar规则,其中提到调用Thread.run()和Runnable.run()方法是一种不好的做法。我想知道可以使用Runnable.run()的场景。与其直接实例化线程,不如依赖ExecutorServices(参见Java教程中的内容)。它们将可运行项作为参数 例如: ExecutorService executorService = Executors.newFixedThreadPool(10); executorService.execute(new Runnable(
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()方法在内部调用 虽然调用
Thread.run()
确实是一种不好的做法,但我不同意在同一句话中命名Runnable.run()
。毕竟,Runnable
是一个普通接口,它的run()
方法是一个普通方法。而且,如果你要实现一个执行者,你必须调用这个方法……这真的很让人困惑,在你的问题中,你说你想更好地理解声纳的违规行为,你接受了一个只给出最佳实践的答案,所以对我来说,这甚至是离题的,请至少重写您的问题,使其与您接受的答案一致接受的答案提供了一个实例,其中Runnable.run()是在线程构造函数之外使用的,这就是我所询问的。这甚至比我认为您在一个问题中有两个问题更糟,因此,您确实需要重写您的问题Runnable
是表示潜在异步任务的标准抽象。它被线程
(您可能应该避免使用)、任务管理框架(如Executor
(您应该优先于线程
)以及API希望表示独立任务的任何位置(如完成处理程序)使用