如何启动匿名线程类

noM*_*MAD 58 java multithreading anonymous-class

我有以下代码片段:

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

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

Jon*_*eet 137

你已经在创建一个Thread类的实例 - 你只是没有用它做任何事情.你甚至可以在start()不使用局部变量的情况下调用:

new Thread()
{
    public void run() {
        System.out.println("blah");
    }
}.start();
Run Code Online (Sandbox Code Playgroud)

...但我个人通常将它分配给一个局部变量,做你想做的任何其他事情(例如设置名称等),然后启动它:

Thread t = new Thread() {
    public void run() {
        System.out.println("blah");
    }
};
t.start();
Run Code Online (Sandbox Code Playgroud)

  • 是什么区别以及在线程构造函数new Thread中创建一个实现者(new Runnable(){public void run(){}}); (2认同)
  • @Malwaregeek:在一种情况下,实现是`Thread`的子类,在另一种情况下,有一个`Runnable`的匿名类实现.它们是不同的,但差异通常是无关紧要的. (2认同)

Dun*_*nes 14

由于匿名类扩展了给定的类,因此可以将它们存储在变量中.

例如.

Thread t = new Thread()
{
    public void run() {
        System.out.println("blah");
    }
};
t.start();
Run Code Online (Sandbox Code Playgroud)

或者,您可以在您立即创建的对象上调用start方法.

new Thread()
{
    public void run() {
        System.out.println("blah");
    }
}.start();
// similar to new Thread().start();
Run Code Online (Sandbox Code Playgroud)

虽然我个人而言,我总是建议创建一个Runnable而不是Thread的匿名实例,因为编译器会警告你,如果你不小心弄错了方法签名(对于一个匿名类,无论如何我都会警告你,因为匿名类无法定义新的非私人方法).

例如

new Thread(new Runnable()
{
    @Override
    public void run() {
        System.out.println("blah");
    }
}).start();
Run Code Online (Sandbox Code Playgroud)


Gra*_*ray 6

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

new Thread() {
    public void run() {
        System.out.println("blah");
    }
}.start();
Run Code Online (Sandbox Code Playgroud)

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

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

new Thread(new Runnable() {
    public void run() {
        System.out.println("blah");
    }
}).start();
Run Code Online (Sandbox Code Playgroud)

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