繁体   English   中英

cpu用法多线程java

[英]cpu usage multithreading java

public class Main {
    public static void main(String[] args) {
        LinkedList<Th> myThreads = new LinkedList<>();

        for (int i = 0; i < 100; i++) {
            myThreads.add(new Th());
            myThreads.get(i).start();
        }
    }
}

public class Th extends Thread {

    int myInt;

    @Override
    public void run() {
        while(true) {
           doSomething();
        }
    }

    private void doSomething() {
        switch (myInt) {
            case 0: {
               // System.out.println("comment part");
                break;
            }
            case 2:{
                System.out.println("2");
                break;
            }
        }
    }
}

嗨,我在Java中遇到了一个简单的多线程问题。 当我运行该程序时,CPU使用率突然达到100%,我的计算机崩溃了,无法停止该程序。 在这里您可以看到代码。 当我取消评论部分时,一切都OK! 但我需要解决此问题,而无需在控制台中打印任何内容。 PS。 我已经知道案例2的代码块永远不会被编译。

这段代码本身没有错。 这是您的机器无法应付您需要完成的工作量。

您的代码产卵100线程,它将打印一些东西到标准输出(昂贵的操作,因为你要问的OS这样做) 一样快,因为他们可以 即使对于现代机器,这也是很多工作。

打印完消息后,尝试自愿放弃CPU一段时间以增加睡眠。

switch (myInt) {
            case 0: {
                System.out.println("message");
                Thread.sleep(50);
                break;
            }

另外,拥有100%的CPU使用率也没有错。 您只是在使用全部可用的计算能力。 这是一件好事,尤其是在科学计算中。

睡个好觉。 只需在打印所在位置调用sleep方法。 您的CPU应当休眠数毫秒,以避免100%消耗它。 在您的情况下,console-io充当睡眠。

尝试减少线程数,并使用循环方法进行计算。

循环(RR)是进程和网络调度程序在计算中使用的算法之一。 正如通常使用的术语一样,将时间片(也称为时间量)以相等的部分并以循环顺序分配给每个过程,从而无优先级地处理所有过程(也称为循环执行)。 参见https://en.wikipedia.org/wiki/Round-robin_scheduling

建议修改:

private void doSomething() {
    switch (myInt) {
        case 0: {
            try {
                sleep(100);
            } catch (InterruptedException e) {
                interrupt();
            }
            break;
        }
        case 2:{
            System.out.println("2");
            break;
        }
    }
}

您应该调用interrupt方法来重新中断线程。 参考: 为什么在捕获任何InterruptException时调用Thread.currentThread.interrupt()?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM