java 多线程经常卡死的问题。

发布于 2022-08-29 21:25:36 字数 1653 浏览 13 评论 0

public class b{
    public Long a(Long next_time){}
    public Long b(Long next_time){}
    public Long c(Long next_time){}
    public Long d(Long next_time){}
}

上面的B类中的a,b,c,d4个方法通过多线程方式同时执行。

public class Main implements Runnable {

    public void run()
    {
        String method = Thread.currentThread().getName();
        Long next_time = 30000L;
        if(method.equals("a"))
        {
            while (true)
            {
                lottery b = new b();
                next_time = b.a();
                Thread.sleep(next_time);
            }
        } else if(method.equals("b"))
        {
            while (true)
            {
                lottery b = new b();
                next_time = b.b();
                Thread.sleep(next_time);
            }
        }else if(method.equals("c"))
        {
            while (true)
            {
                lottery b = new b();
                next_time = b.c();
                Thread.sleep(next_time);
            }
        }else if(method.equals("d"))
        {
            while (true)
            {
                lottery b = new b();
                next_time = b.d();
                Thread.sleep(next_time);
            }
        }
    }
    public static void main(String[] args) {
        new Thread(new Main(),"a").start();
        new Thread(new Main(),"b").start();
        new Thread(new Main(),"c").start();
        new Thread(new Main(),"d").start();
    }
}

上面的代码比较简单。就是并发无限执行b类里面的4个方法。通过数据库日志发现经常执行B类里面的某一个方法到某一行代码以后就不会往下面执行代码了。要通过重启jar才可以。要怎么设置超时或者其他方法一直无限运行。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

能怎样 2022-09-05 21:25:36

最后可能是内存溢出了吧

永言不败 2022-09-05 21:25:36

看着这种if .. else .. 蛋疼

不念旧人 2022-09-05 21:25:36

有可能是你的某个方法返回了较大的数值,所以一直在等待。

如果你想检查超时,可以另建一个线程,定时(按超时时间)去检查A-D线程的一个过得否执行完毕,如果未执行完毕,而且超过指定时间,则调用其 interrupt()

示意代码(仅示意,可能有点拼写或者语法错误)

public class Main implements Runable {
    private long startTime;

    public long getStartTime() {
        return startTime;
    }

    public void run() {
        while (true) {
            try {
                startTime = System.currentTimeMillis();
                // .....
                Thread.sleep(next_time);
            } catch (InterruptedException e) {
                continue;
            }
        }
    }

    public static void main(String[] args) {
        Main a = new Main();
        new Thread(a, "a").start();
        DaemonThread daemon = new DaemonThread();
        daemon.setMain(a);
        new Thread(daemon, "daemon").start();
    }
}

class DaemonThread implements Runable {
    public static final long TIMEOUT = 30000L;

    // can use a list or array to instead
    Main a;

    // can use addMain to instead
    public void setMain(Main m) {
        a = m;
    }

    public void run() {
        while (true) {
            Thread.sleep(300)
            if (a == null) {
                continue;
            }

            if (System.currentTimeMillis() - a.getStartTime() > TIMEOUT) {
                a.interrupt();
            }
        }
    }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文