java - 为什么要为 Threads 创建一个匿名的 Runnable 子类?

标签 java multithreading coding-style

<分区>

在使用线程时,写这样的东西是很常见的:

Runnable r = new Runnable()
{
    public void run() { /* ... */ }
};
new Thread(r).start();

这一切都很好而且正确,但我相信可以通过更高效、更简单的方式实现同​​样的目标:

new Thread()
{
    public void run() { /* ... */ }
}.start();

但是,在使用 ThreadsRunnable 的代码示例中,我几乎从未见过这样的事情。使用第一个示例而不是第二个示例是否有任何技术或样式相关的原因?

最佳答案

因为

Runnable r = new Runnable()
{
    public void run() { /*your code */ }
};
new Thread(r).start();
new Thread(r).start();
new Thread(r).start();
new Thread(r).start();

等于

new Thread()
{
    public void run() { /* ... */ }
}.start()
new Thread()
{
    public void run() { /* ... */ }
}.start();

new Thread()
{
    public void run() { /* ... */ }
}.start();
new Thread()
{
    public void run() { /* ... */ }
}.start();

它们并不完全相等。在第一种情况下,所有线程在第二种情况下共享相同的可运行对象,但它们不会。在第一种情况下,写入 volatile 字段(或者如果存在 happens-before ),将对其他线程可见。

关于java - 为什么要为 Threads 创建一个匿名的 Runnable 子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31639343/

相关文章:

Java:设置从运行线程为字符串赋值?

multithreading - 为每个线程分配一个面板 - Delphi

android - 在 AsyncTask 中启动 Activity 时内存泄漏(由 Thread 更改)

vim - 在 Vim 中使用 AStyle

java - 如何将 JTextPane 样式的内容输出到 HTML,包括自定义样式?

java - java中模拟全局变量的查询

java - Controller 类中 FXML Controller 的 Getters 而不是查找?

java - Cometd 过滤 channel 中特定客户端的数据

java - 您将如何优化(无代码重复)具有许多此类功能的 Java 代码

java - 为什么我的错误被 Kapt 和 Kotlin 掩盖了?如何增加错误限制?