cpu用法多线程java

时间:2017-07-13 11:41:51

标签: java multithreading cpu

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%,我的计算机崩溃,我无法停止程序。 在这里你可以看到代码。 当我取消评论评论部分时,一切都很好!但我需要修复此问题,而无需在控制台中打印任何内容。 PS。我已经知道案例2代码块从未编译过。

2 个答案:

答案 0 :(得分:4)

此代码本身没有任何错误。 这是你的机器无法应付你需要它完成的工作量。

您的代码会生成100个线程,这些线程会将某些内容打印到标准输出(代价高昂的操作,因为您必须要求操作系统执行此操作)尽可能快。即使对于现代机器来说,这也是很多工作。

在打印完信息后,尝试自愿放弃CPU一段时间。

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

另外,使用100%使用CPU没有任何问题。您只是使用可用的整个计算能力。这是好事,特别是在科学计算中。

答案 1 :(得分:1)

加入睡眠。只需调用打印方式的睡眠方法即可。 您的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方法重新中断线程。 请参阅:Why invoke Thread.currentThread.interrupt() when catch any InterruptException?