如何启动匿名线程类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何启动匿名线程类相关的知识,希望对你有一定的参考价值。

我有以下代码片段:

public class A {
    public static void main(String[] arg) {
        new Thread() {
            public void run() {
                System.out.println("blah");
            }
        };
    }
}

在这里,如何在不创建线程类实例的情况下为线程调用start()方法?

答案

不完全确定这是你要问的,但你可以这样做:

new Thread() {
    public void run() {
        System.out.println("blah");
    }
}.start();

注意匿名类末尾的start()方法。您创建线程对象但您需要启动它以实际获得另一个正在运行的线程。

比创建一个匿名的Thread类更好的是创建一个匿名的Runnable类:

new Thread(new Runnable() {
    public void run() {
        System.out.println("blah");
    }
}).start();

而是覆盖run()中的Thread方法,你注入一个目标Runnable由新线程运行。这是一个更好的模式。

另一答案

只需调用start()

new Thread()
{
    public void run() {
        System.out.println("blah");
    }
}.start();
另一答案

整个new表达式是一个对象引用,因此可以在其上调用方法:

public class A {
    public static void main(String[] arg)
    {
        new Thread()
        {
            public void run() {
                System.out.println("blah");
            }
        }.start();
    }
}
另一答案

添加:现在您可以使用lambda来简化语法。要求:Java 8+

public class A {
    public static void main(String[] arg)
    {
        Thread th = new Thread(() -> {System.out.println("blah");});
        th.start();
    }
}
另一答案

我很惊讶我没有看到Java的Executor框架提到这个问题的答案。 Executor框架的主要卖点之一是你没有处理低级线程。相反,你正在处理ExecutorServices的更高层次的抽象。因此,不要手动启动线程,只需执行包装Runnable的执行程序。使用单线程执行程序,您创建的Runnable实例将在内部被包装并作为线程执行。

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
// ...

ExecutorService threadExecutor = Executors.newSingleThreadExecutor();
try {
  threadExecutor.execute(
    new Runnable() {
      @Override
      public void run() {
        System.out.println("blah");
      }
    }
  );
} finally {
    threadExecutor.shutdownNow();
}

为方便起见,请参阅code on JDoodle

另一答案

将此留在这里以供将来参考,但它也是一个答案。

new Thread(() - > whatever())。start();

以上是关于如何启动匿名线程类的主要内容,如果未能解决你的问题,请参考以下文章

通过匿名内部类方式使用多线程

线程--匿名内部类实现多线程的2种方式

Java线程Thread使用匿名内部类创建的两种方式

匿名内部类

Lambda 表达式

多线程知识