Java线程错误

时间:2012-05-31 09:00:39

标签: java multithreading

对于给定的程序,你能解释一下,因为我得不到我的预期:

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

我需要有人向我解释为两个帖子kq设置的优先级,以便q的输出成为第一个而不是k,无论睡眠时间如何。

我的论点:因为k.start()q.start()之前被调用,所以我希望我的输出以k开头,因为我先调用它,然后两者占用相同的休眠时间。 / p>

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

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