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)
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)
不完全确定这是你要问的,但你可以这样做:
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要由新线程运行的目标.这是一个更好的模式.