猿问

为什么在@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 从未启动,为什么会发生这样的事情?


jeck猫
浏览 314回答 4
4回答

饮歌长啸

因为您没有创建线程。取而代之的是,您正在创建Runnable实例,然后运行它们的run方法。而是这样做:new Thread(threadAlpha).start(); new Thread(threadBeta).start();

手掌心

当您调用threadBeta.run()或threadAlpha.run()时,您正在调用一个具有无限循环的方法。您不是在创建线程。这就是为什么即使threadBeta.run()处于无限循环中,threadAlpha.run() 也不会执行。相反,您可以这样做:new Thread(threadBeta).start(); new Thread(threadAlpha).start();

蛊毒传说

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();    }}

明月笑刀无情

当您调用threadAlpha.run()并threadBeta.run()在当前线程中执行它时。为了在新线程中简单执行,您可以使用:Thread t1 = new Thread(threadAlpha);t1.start();Thread t2 = new Thread(threadBeta);t2.start();
随时随地看视频慕课网APP

相关分类

Java
我要回答