如何启动匿名线程类

问题描述 投票:58回答:8

我有以下代码片段:

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

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

java multithreading anonymous-class
8个回答
6
投票

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

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由新线程运行。这是一个更好的模式。


3
投票

只需调用start()

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

3
投票

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

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

2
投票

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

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

0
投票

我很惊讶我没有看到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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.