当我在Java中创建一个线程时,到底发生了什么?

时间:2013-12-24 05:46:27

标签: java multithreading

Java中的线程可以通过两种方式定义:

  1. 您可以实现Runnable接口。
  2. 您可以扩展Thread类本身。
  3. 创建线程的方法是什么?

    Thread t = new Thread() {
        @Override
        public void run() {
            try {
                sleep(10000);
            } 
            catch (InterruptedException e) {
                System.err.println(e);
            }
            finally {
                finish();
            }
        }
    };
    
    t.start();
    

    这是一个匿名课吗?这段代码工作正常,我测试了这段代码。但我不明白这里发生了什么。

5 个答案:

答案 0 :(得分:1)

是的,您的代码会创建Anonymous class

答案 1 :(得分:0)

  

这是匿名课吗?

是的,这是匿名的内联类实现。当您想使用内联类实现在本地创建类的线程对象时,可以使用此方法。

答案 2 :(得分:0)

这是匿名类吗?是匿名类

阅读本文以了解anonymous class 和好的例子here

答案 3 :(得分:0)

您的代码在某种意义上等同于拥有一个单独的类,如此定义。

public class SleepyThread extends Thread {
    @Override
    public void run() {
        try {
            sleep(10000);
        } 
        catch (InterruptedException e) {
            System.err.println(e);
        }
        finally {
            finish();
        }
    }
}

然后有这样的代码。

Thread t = new SleepyThread();
t.start();

但是因为你只需要在一个地方使用这个类,所以没有必要给它一个名字,或者给它自己的源文件。您可以按照完成它的方式简单地内联类定义。

编译器仍然会为它创建一个类文件,其名称类似于MyClass$1.class,其中MyClass是您正在使用它的类。它只是“匿名”,因为你没有给它起名字。它在各方面都是一个完全成熟的课程。

答案 4 :(得分:0)

这就是我们所谓的匿名课程,你是对的: -

Java中的线程可以通过两种方式定义:    

  • 您可以实现Runnable接口。    
  • 您可以扩展Thread类本身。

    实际上你在内部创建了一个匿名类,它是一个扩展Thread类的子类。 所以这里你的线程由第二个选项定义..!