永发信息网

java中用多线程cup利用率过高

答案:1  悬赏:0  手机版
解决时间 2021-04-14 14:32
  • 提问者网友:兔牙战士
  • 2021-04-14 06:06
package Ex0331;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;
public class SynchroTest extends JFrame{
private static int count = 0;
private Thread t1;
private Thread t2;
private static int flag = -1;
public SynchroTest(){
super();
Container c = getContentPane();
c.setLayout(null);
JButton jb1 = new JButton("write in");
JButton jb2 = new JButton("read out");
jb1.setBounds(20, 30, 140, 21);
jb2.setBounds(230, 30, 140, 21);
jb1.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
flag = 0;
System.out.println(flag);
}
});
jb2.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
flag = 1;
System.out.println(flag);
}
});
c.add(jb2);
c.add(jb1);
t1= new Thread(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
while(true){
if(flag == 0){

if(count < 10){
count ++;
System.out.println("write! count = " + count);
}else{
System.out.println("cannot write in,current count is : " + count);
}
flag = -1;
}
}
}
});
t1.start();
t2 = new Thread(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
while(true){
if(flag == 1){

if(count > 0){
count--;
System.out.println("read! count = " + count);
}else{
System.out.println("connot read out,current count is : " + count);
}
flag = -1;
}
}

}
});
t2.start();
}
public static void main(String args[]) {
JFrame jf = new SynchroTest();
jf.setSize(400, 400);
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
代码如上,每次运行cup的使用率都是百分之百,有什么解决办法?
最佳答案
  • 五星知识达人网友:雪起风沙痕
  • 2021-04-14 07:13
因为你的两个线程的while的循环条件都为真,因此,两个线程是在不停地进行while循环体里的计算,因此,你的CPU损耗就产生在这里,因为他们没有停止过。

要修改下,让每个while执行一次循环体后sleep1 秒,这样就把CPU空余出来了。

要修改的地方:
--------------------------------------------------

while (true) {
if (flag == 0) {
//省略......
}
//添加的部分
try {
t1.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//添加结束
}

------------------------------------------------

while (true) {
if (flag == 1) {
//省略......
}
//添加的部分
try {
t2.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//添加结束
}
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯