黑马程序员技术交流社区
标题:
线程问题
[打印本页]
作者:
赵庆礼
时间:
2012-6-27 08:17
标题:
线程问题
本帖最后由 赵庆礼 于 2012-6-27 11:47 编辑
class Ticket implements Runnable
{
private int tick =100;
private Object obj = new Object();
public void run()
{
while (true)
{
synchronized(obj)
{
if(tick>0)
{
try
{
Thread.sleep(10);
System.out.println(Thread.currentThread().getName()+"run ...."+tick--);
}
catch (Exception e)
{
}
System.out.println(Thread.currentThread().getName()+"run ...."+tick--);
}
}
}
}
}
class ThreadDemo2
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
这儿程序执行后为什么cpu占用率特别大,调试了很久没有找到原因在哪
作者:
韦念欣
时间:
2012-6-27 08:39
本帖最后由 韦念欣 于 2012-6-27 08:46 编辑
楼主的循环while(true)是无限循环,没有出口,当票卖完之后,也出不来,程序就再那里死循环了,而且是4个线程在空转(死循环),所以占用CPU很高!
可以在if代码块后面添加break;跳出循环的语句。
具体修订代码如下:
class Ticket implements Runnable
{
private int tick =1000; // 为了更好的看到线程效果,设置tick数量大一些
private Object obj = new Object();
public void run()
{
while (true)
{
synchronized(obj)
{
if(tick>0)
{
try
{
Thread.sleep(10);
System.out.println(Thread.currentThread().getName()+"run ...."+tick--);
}
catch (Exception e)
{
}
//System.out.println(Thread.currentThread().getName()+"run ...."+tick--);
}
else // 在这里添加if的配对语句else
break; // 如果tick不大于0,则break跳出循环,防止程序空转(死循环)
}
}
}
}
class ThreadDemo2
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
复制代码
作者:
李文龙
时间:
2012-6-27 08:48
while (true)
这个地方的问题,当票卖完的时候,程序依旧还在进行循环,没有退出运行,所以占用的cpu资源会一直存在,且呈上升的趋势,因为内存空间没有被释放掉,解决的方法是将循环的条件改为
while (tick>0)
就可以了。
作者:
常佳杰
时间:
2012-6-27 09:41
还有一种方式等tick!>0时,关闭线程也可以
class Ticket implements Runnable
{
private int tick =100;
private Object obj = new Object();
public void run()
{
while (true)
{
synchronized(obj)
{
if(tick>0)
{
try
{
Thread.sleep(10);
System.out.println(Thread.currentThread().getName()+"run ...."+tick--);
}
catch (Exception e)
{
}
System.out.println(Thread.currentThread().getName()+"run ...."+tick--);
}
else{
t1.stop();
t2.stop();
t3.stop();
t4.stop();
}
}
}
}
}
class ThreadDemo2
{
public static void main(String[] args)
{
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
复制代码
作者:
赵庆礼
时间:
2012-6-27 11:46
韦念欣 发表于 2012-6-27 08:39
楼主的循环while(true)是无限循环,没有出口,当票卖完之后,也出不来,程序就再那里死循环了,而且是4 ...
谢谢,看懂了
作者:
赵庆礼
时间:
2012-6-27 12:00
韦念欣 发表于 2012-6-27 08:39
楼主的循环while(true)是无限循环,没有出口,当票卖完之后,也出不来,程序就再那里死循环了,而且是4 ...
谢谢,看懂了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2