0

对于给定的程序,您能否解释一下,因为我没有得到预期的结果:

package javaapplication14;

class Mythread implements Runnable{
    String myname;
    int myage;

    public Mythread( String par_name, int par_age){
        myname = par_name;
        myage = par_age;
    }
    public void run(){
        try{
          for(int i=1; i<=myage; i++)  {
              System.out.println("Happy birthday "+myname);
              Thread.sleep(2000);
          }
        }catch(Exception e){
            System.out.println();
        }
    }
}
public class JavaApplication14 {

    public static void main(String[] args) {
      Mythread m = new Mythread("Mutinda ", 2);
      Mythread p = new Mythread("Boniface", 2);
      Thread k = new Thread(m);
      Thread q = new Thread(p);
      k.start();
      q.start();
      Thread t = new Thread(m);
      try{
        for( int i=1; i<=5; i++){
          System.out.println("Main thread executing");
          Thread.sleep(1000);          
        }  
      }catch(Exception e){
          System.out.println("Thread interrupted");
      }

    }
}

这是我的输出:

Main thread executing
Happy birthday Boniface
Happy birthday Mutinda 
Main thread executing
Main thread executing
Happy birthday Boniface
Happy birthday Mutinda 
Main thread executing
Main thread executing

我期待这个:

Main thread executing
Happy birthday Mutinda 
Happy birthday Boniface
Main thread executing
Main thread executing
Happy birthday Mutinda
Happy birthday Boniface
Main thread executing
Main thread executing

我需要有人向我解释为两个线程设置的优先级,k并且无论睡眠时间如何,q输出都q成为第一个 than 。k

我的论点:因为在 ,k.start()之前被调用q.start(),所以期望我的输出以 开始k,因为我首先调用它并且两者花费相同的睡眠时间。

4

3 回答 3

3

基本上你的论点是错误的。start() 函数不会启动踏板。它只是将其置于可运行状态。

于 2012-05-31T09:03:27.400 回答
3

当您启动线程时,这是因为您有独立的任务,这些任务很少或没有相互依赖。因此,您不应该期望两个线程之间有特定的执行顺序,实际上大多数多线程错误来自做出这样的假设。

如果您希望事情以特定顺序发生,请使用单个线程。如果您可以假设任务没有特定的顺序,那么只有使用多个线程。

于 2012-05-31T09:04:45.340 回答
0

您不能依赖于多线程序列执行的优先级。Java Threading 的基本规则是它依赖于 JVM,并且不能确定每个线程的执行顺序。优先级可以影响但不能确保执行

于 2012-05-31T09:08:14.073 回答