当前位置: 首页 > 知识库问答 >
问题:

为什么扩展线程的内部类的执行线程是主线程?

湛嘉歆
2023-03-14

我很难理解内部类线程的行为。

public class Test {
    private static Random rand = new Random(System.currentTimeMillis());

    public class TestThread extends Thread {
        @Override
        public void start() {
            System.out.println("in start " + Thread.currentThread().getName());
            try {
                Thread.sleep(rand.nextInt(5000));
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    public static void main(String[] args){
        System.out.println(Thread.currentThread().getName());
        for(int i = 0; i < 5; ++i){
            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(rand.nextInt(5000));
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName());
                }
            }).start();
        }

        System.out.println("new run");
        Test test = new Test();
        for(int i = 0; i < 5; ++i){
            (test. new TestThread()).start();
        }
    }
}

system.out.println(“in start”+Thread.CurrentThread().GetName());

它总是打印出“main”,并且线程是按顺序执行的。为什么内部类线程的执行由主线程执行?

谢谢!

共有1个答案

沃威
2023-03-14

不要重写thread.start()。start方法总是从启动它的线程调用。您需要重写thread.run()

(请参阅thread类'javadoc文档中的示例)

 类似资料:
  • 我确信这两个列表都不是空的,并且正在调用,但是没有调用order execution run方法....

  • 我需要编写一个扩展Thread类的应用程序。我的类在实例化时接受一个整数(即100)<代码>(MyThread myt=新的MyThread(100);) 这个整数将是这个类循环并打印消息的次数。消息应该是“线程正在运行…100”。100将是我传入构造函数的任何数字。如果数字是150,那么输出应该是“线程正在运行…100”。我应该使用main方法来测试这个类。在主线程中,我将启动两个线程,一个线程

  • 问题内容: 我刚刚遇到了这个“错误”,但是我不确定这是否是故意的:代码: 在第一个示例中,它是在swing线程上执行的,但在第二个示例中,它不是,尽管我认为应该这样做。 这是错误还是故意的? 问题答案: 在我看来,这似乎是您的误解 第一行就像在说:“好吧,秋千,我想要你做的是”。所以Swing执行它 第二行就像是说:“确定,Swing,我要您执行的是方法返回的对象的方法”。一个是方法, 我现在执行

  • 在下面的代码中,为什么主线程要等到子线程完成。 Driver.java ThreadRunner.java 调用“t.start()”后,在驱动程序类中,程序是否应该退出?我没有使用join,但主线程仍在等待,直到新旋转的“ThreadRunner”运行开始。这是因为在java中,主线程(由main方法启动)总是等待所有线程关闭吗?

  • 我已经查看了这里给出的一些ANWER,但我没有得到解决我问题的确切方法:我不想创建一个新的类并扩展runnable或Thread。 我有一个服务,它在创建时必须每10秒检查一些东西,并且所需的调用不能从主线程执行,所以在StartCommand()方法中我执行以下操作: 现在,当我调用onStopService()时,我想停止这个线程。方法stop()不推荐使用,因此我使用中断(): 正如我预期的

  • 代码更清晰,处理逻辑更简单; 不用考虑各种锁的问题,不存在加锁和释放锁的操作,没有因为可能出现死锁而导致的性能问题; 不存在多线程切换而消耗CPU; 无法发挥多核CPU的优势,但可以采用多开几个Redis实例来完善;