刚看到多线程这部分,例子程序如下,是一个粗模拟4售票点售票的问题public class test { /**
 * @param args
 */
public static void main(String[] args) {
// TODO Auto-generated method stub
TestThread t=new TestThread();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
new Thread(t).start();
}
}
class TestThread implements Runnable
{
private int tickets=20;
public void run()
{
while(true)
{
if(tickets>0)
System.out.println(Thread.currentThread().getName()+"出售"+tickets--);
}
}
}
问题主要有2个一、在TestThread类中,tickets变量并没有设置为 static ,为什么还能得到最后的结果呢?二、跑这个程序的时候,我的i7 2630 CPU负载50%,这个简单的程序怎么这么吃CPU呢

解决方案 »

  1.   

    先回答你第二个问题,你的while循环能跳出来吗?
    当tickets>0这个条件不满足的时候while循环还是在执行的噢。曾经试过while(true){}这样的代码,CPU一直在占用,但是不知道程序在干啥不知道有木有人对这样的代码有研究。。
      

  2.   

    四个new Thread(t).start()相当于调用t一个对象的run方法,而一个对象的tickets变量是相同的,故而相当于声明了static 
    如果你声明四个TestThread对象,用同一个人Thread对象执行这四个目标就可将tickets变量分开每一个Thread线程对象好像占1MB内存
      

  3.   

    问题1:不用static啊,因为你这里起的四个线程都是同一个对象的,所以只需要声明一个全局变量就成了,static只是多个对象同时共享一个数据。
    问题2: 为什么这么吃cpu我不确定,可能跟代码的执行效率有关吧,毕竟线程这种东西是直接控制CPU去做一些事情,不想普通的单线程程序,而且也存在线程调度。呵呵 不太确定,不过我曾经用线程跑死过Eclipse
      

  4.   


    程序一直在疯狂的执行这段代码导致的.
    即使你循环体里面没有代码,while(true)这个判断条件也是在不断执行的,JVM不停的在执行判断导致CPU满负荷运算.这个代码放到任何CPU上都会导致一样的结果.区别只是单位时间内执行次数的不同而已.
      

  5.   

    第一个问题:tickets 当然不用static,因为只有一个实例嘛,一个实例多个线程在跑,多个线程共享同一个实例,所以他们都是可以访问的,所以才会有同步的问题出现嘛~~~第二个问题: 死循环。。
      

  6.   

    死循环就是耗 CPU 的,没办法。
      

  7.   

    第一个问题我无法回答.我对线程也不怎么懂.
    第二个问题:
    你的这个段代码是死循环在一直执行.线程直接调用CPU,那么CPU会一直计算所以会出现CPU使用率高.
      

  8.   


    同意,第二个问题,楼主起了4个线程,那么就有4个死循环,自然占用CPU了