JAVA CODE:class Machine extends Thread
{
public void run()
{
for(int a=0;a<20;a++)
System.out.println(currentThread().getName()+":"+a);
/*try
{
sleep(10);
}catch(InterruptedException e)
{
throw new RuntimeException(e);
}*/
}
public static void main(String[] args) 
{
Machine machine1 = new Machine();
Machine machine2 = new Machine();
machine1.setName("m1");
machine2.setName("m2");
machine1.start();
machine2.start();
//machine1.run();
}
}

解决方案 »

  1.   

    忘了提问题了线程machine1和machine2是轮流执行run方法吗?还是等machine1执行完了在执行machine2呢?如果是前者,当线程machine1执行的时候,怎么会把cpu让给machine2呢,它本身还没执行完毕啊?
      

  2.   

    lz是在看孙卫琴的书吧.出现m1 和m2 轮换的现象.
    1,因为线程的启动是需要时间
    2,java中的线程是抢占式的.machine1 和 machine2都是由主线程启动的.的当machine1.start启动的时候
    machine2线程还没有启动所以.
    m1先执行. m1执行一段时间后主线程把m2启动所以m2开始执行.
      

  3.   

    我的网速问题,没看到2,3楼的。
    优先级相同的情况下会轮流执行的。
    你先调用machine1.start()方法,machine1会先执行run方法,具体cpu怎么让给machine2的问题,我也在这关注把
      

  4.   

    可是m2执行的时候 m1可能并没有把cpu让出来啊 这样m2就不能执行了吧
      

  5.   

    这个你不用管啊  
    这个就是操作系统调度的问题当然如果优先级一样的话machine1一直占用cpu 显然她不会把控制权交给2 个人理解
      

  6.   

    可是我运行的时候结果是
    m1:0
    m1:1
    m1:2
    m1:3
    m2:0
    m2:1
    m2:2
    m2:3
    m2:4
    m2:5
    m2:6
    m2:7
    m2:8
    m2:9
    m2:10
    m2:11
    m2:12
    m2:13
    m2:14
    m2:15
    m2:16
    m2:17
    m2:18
    m2:19
    m1:4
    m1:5
    m1:6
    m1:7
    m1:8
    m1:9
    m1:10
    m1:11
    m1:12
    m1:13
    m1:14
    m1:15
    m1:16
    m1:17
    m1:18
    m1:19m1和m2优先级不是一样吗?
      

  7.   


    不是轮流执行,线程的执行会由jvm去分配,至于怎么分配,只有天知道了。jvm会划分时间段,某个时间段内做线程1,某个时间段做线程2,并不会等线程1执行完再执行线程2
      

  8.   

    也就是说jvm先把定义好的线程的时间片分配好 然后在run 
      

  9.   


    但是你先调用mi的start()方法,要不你把m1和m2的start方法换过来看看。
      

  10.   

    而且我觉得 你在输出的时候调用了io设备。这个时候cpu空闲 也肯定回去执行其他线程。
    至于内部究竟是不是 先来先服务 还是时间片没研究过
      

  11.   


    也不能这么说。
    准确的说,Java的线程调度机制是抢占式的,只要他认为有必要,就会中断现在的线程,
    然后资源就由另一个幸运的线程占有并执行。这一切并不是我们可以控制的。楼主你看到的结果只不过是在你机器上的那个环境下的结果,
    当换了一个环境的时候,结果就会不一样。不知道我这么说你可了解
      

  12.   

    public class ThreadTest {
    public static void main(String[] args) {
    ThreadTest1 machine1 = new ThreadTest1();
    ThreadTest2 machine2 = new ThreadTest2();
    machine1.start();
    machine2.start();
    }
    }
    class ThreadTest1 extends Thread {
    public void run() {
    while (true) { }
    }
    }
    class ThreadTest2 extends Thread {
    public void run() {
    System.out.println("11111");
    }
    }这个肯定就可以看出来了 是一个执行一会儿 应为他始终会去输出11111
      

  13.   

    我在看孙卫琴的书看到好几个关于线程的程序学到yield(),sleep()。。好几个中断线程的方法 然后想到我上面写的这个程序 就想到程序根本就每调用暂停线程的方法 当前正在执行的线程就暂时中断了呢谢谢你的答案了 但我还是有点不明白 还是得想想 
      

  14.   


       “在抢占式线程模型中,操作系统可以在任何时候打断线程。通常会在它运行了一段时间(就是所谓的一个时间片)后才打断它。这样的结果自然是没有线程能够不公平地长时间霸占处理器。然而,随时可能打断线程就会给程序开发员带来其他麻烦。同样使用办公室的例子,假设某个职员抢在另一人前使用复印机,但打印工作在未完成的时候离开了,另一人接着使用复印机时,该复印机上可能就还有先前那名职员留下来的资料。抢占式线程模型要求线程正确共享资源,协作式模型却要求线程共享执行时间。由于 JVM 规范并没有特别规定线程模型,Java 开发员必须编写可在两种模型上正确运行的程序。在了解线程以及线程间通讯的一些方面之后,我们可以看到如何为这两种模型设计程序。”
      

  15.   

    他们是靠cpu分配时间来执行的
    所以在其他地方执行结果每次都会不一样
      

  16.   

    这是个线程调度问题,除了主线程外还有两个生成的线程,这三个线程都会被带到CPU的线程等待队列中,至于怎样调度完全取决于操作系统的调度方式,一般来说,同一等级的线程会按照时间片断不确定地执行。
      

  17.   

    就这个程序而言,应该是先执行machine1,再执行machine2的
    如果加上你屏蔽的代码,结果就有n种可能了
    因为sleep了线程1,但是由于它非常短,所以可能已经执行完成了
      

  18.   

    建议lz不要看国内的书,你应该把线程看出是并行的,但cup在一个时间只能有一个线程,所以当线程开启之后,如果优先级相同线程之间得到cup的概率是相等的,这种抢占式方法并没有什么轮流得,从同个程序在不同机器上得到不同结果就可以看出
      

  19.   

    jvm是个很奇怪的东西,你在程序中在加一个machine3看看
      

  20.   

    如果你把run方法同步,才有这种效果...不然,你以为线程是什么?
      

  21.   

    不是随机分配时间片的!是根据JVM的线程调度算法和线程的优先级来进行调度的。