java - 为什么主线程在这里没有被抢占?

标签 java multithreading static singleton

public class SingletonClass {
private static SingletonClass singletonClass;
public void executeMethod(String string) {
    System.out.print("["+string);
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println("]");
}
private SingletonClass() {

}
public static SingletonClass getInstance() {
    if(singletonClass==null)
        singletonClass=new SingletonClass();
    return singletonClass;
}

public static void main(String args[]) {
    SingletonClass.getInstance().executeMethod("MainThread");
    new SingleTonThread(SingletonClass.getInstance());
}

}

class SingleTonThread implements Runnable{
private SingletonClass sc;
SingleTonThread(SingletonClass singleton){
    this.sc=singleton;
    Thread t = new Thread(this);
    t.start();
}
@Override
public void run() {
    sc.executeMethod("SingleTonThread");
}

}

我期望以下输出(因为主线程应该被 SingleTonThread 抢占): 预期输出:[MainThread[SingleTonThread] ] 实际输出: [主线] [单吨线程]

最佳答案

调用时:

SingletonClass.getInstance().executeMethod("MainThread");

您已通过调用阻塞了主线程

sleep(1000)

下面启动线程类的行将不会被执行,直到

executeMethod("MainThread")

即将执行完毕

顺便说一句,在构造函数中启动线程是一种非常糟糕的做法 as described in this question

关于java - 为什么主线程在这里没有被抢占?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50686424/

相关文章:

c++ - 使用私有(private)成员初始化静态常量,非整数类成员

java - 运行 servlet 程序

java - 在 java 类上生成 C++ 包装器的工具

java - 比较java中包含相同对象的两个ArrayLists

c - 在这种情况下哪种操作系统概念应该更好

java - 我的线程在运行几个小时后停止

python - Flask 中的静态文件 - robots.txt、sitemap.xml (mod_wsgi)

java - 代码并没有完全按照我想要的方式执行。提前退出循环

c++ - 在多个线程中从列表中删除元素

php - 非静态方法......不应该被静态调用