为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在@PostConstruct 方法中实际上只能启动一个线程?

为什么在@PostConstruct 方法中实际上只能启动一个线程?

jeck猫 2023-06-08 17:22:59
@Componentclass 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 回答

?
饮歌长啸

TA贡献1951条经验 获得超3个赞

因为您没有创建线程。取而代之的是,您正在创建Runnable实例,然后运行它们的run方法。

而是这样做:

new Thread(threadAlpha).start();
new Thread(threadBeta).start();


查看完整回答
反对 回复 2023-06-08
?
手掌心

TA贡献1942条经验 获得超3个赞

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

new Thread(threadBeta).start();
new Thread(threadAlpha).start();


查看完整回答
反对 回复 2023-06-08
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

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

    }

}


查看完整回答
反对 回复 2023-06-08
?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

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


Thread t1 = new Thread(threadAlpha);

t1.start();

Thread t2 = new Thread(threadBeta);

t2.start();


查看完整回答
反对 回复 2023-06-08
  • 4 回答
  • 0 关注
  • 313 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信