有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

为什么@PostConstruct方法只能启动一个线程?

@Component
class Type
{
    @PostConstruct
    private void postConstructor() {

        Runnable threadAlpha = () -> {
            while (true) {
                workWithSomething();
                try {
                    Thread.sleep(1000 * 60);
                } catch (InterruptedException e) {
                }
            }
        };
        Runnable threadBeta = () -> {
            while (true) {
                workWithOtherthing();
                try {
                    Thread.sleep(1000 * 3);
                } catch (InterruptedException e) {
                }
            }
        };
        threadBeta.run();
        threadAlpha.run();
    }
}

对于spring framework,我正在努力处理这段代码,问题是只有一个线程可以实际启动,首先调用run(),如果我将位置切换为如下所示,则另一个线程似乎冻结:

        threadAlpha.run();
        threadBeta.run();

那么threadBeta从未开始,为什么会发生这样的事情


共 (4) 个答案

  1. # 1 楼答案

    当您调用threadAlpha.run()threadBeta.run()时,您正在当前线程中执行它。对于在新线程中的简单执行,您可以使用:

    Thread t1 = new Thread(threadAlpha);
    t1.start();
    Thread t2 = new Thread(threadBeta);
    t2.start();
    

    来自Oracle的教程

  2. # 2 楼答案

    当你在呼叫threadBeta时。运行()。run()您正在调用一个具有无限循环的方法。您没有创建线程。这就是为什么threadAlpha。run()即使是threadBeta也没有执行。run()处于无限循环中。相反,你可以这样做:

    new Thread(threadBeta).start();
    new Thread(threadAlpha).start();
    
  3. # 3 楼答案

    因为你没有创建线程。而不是创建Runnable实例,然后运行它们的run方法

    而是这样做:

    new Thread(threadAlpha).start();
    new Thread(threadBeta).start();
    
    
  4. # 4 楼答案

    Runnable run()在当前线程中执行,因此该行为也随之发生。如果要在两个独立的线程中运行,请使用Thread并在这些线程上调用start

    public class SpringMultipleThreads {
        public static void main(String[] args) {
            new SpringMultipleThreads().postConstructor();
        }
        private void postConstructor() {
    
            Thread threadAlpha = new Thread(() -> {
                while (true) {
                    System.out.println("1");
                    try {
                        Thread.sleep(1000 * 3);
                    } catch (InterruptedException e) {
                    }
                }
            });
            Thread threadBeta = new Thread(() -> {
                while (true) {
                    System.out.println("2");
                    try {
                        Thread.sleep(1000 * 3);
                    } catch (InterruptedException e) {
                    }
                }
            });
            threadBeta.start();
            threadAlpha.start();
        }
    }