贴代码:public class b implements Runnable{
void f(){
synchronized (this){
try{
Thread.sleep(1000);
System.out.println("f()");
}catch(Exception e){e.printStackTrace();}
}
}
void g() throws Throwable{
System.out.println("start");
Thread t=new Thread(this);
t.setPriority(6);//当为7的时候结果和6不一样~~
t.start();
synchronized (this){Thread.sleep(2000);}
System.out.println(t.getPriority()+" "+Thread.currentThread().getPriority());
}
public void run(){
f();
}
public static void main(String[] args) throws Throwable {
new b().g();
}
}为啥当t.setPriority(6)时,锁是由主线程获得的?而当为7的时候锁却是由新建线程获得的。。呃。。就这里就迷糊了。。

解决方案 »

  1.   

    好吧,查了一下,好像是说线程执行的顺序不以优先级为绝对依据的,优先级只是代表了其执行概率的大小。但是,貌似在1~10个优先级中,有明显的分级趋势。就好像说1和2是一级的,3和4是一级的,5、6一级,7、8、9、10是一级。当优先级以2和3为例时,有99%的概率是3的先被执行(至少我没试出来2的先被执行~~)。而主线程似乎拥有着比5、6这一个高的优先级,却又比7、8、9、10这一级要低。同时,在多个优先级并存,同时有N个线程的情况下,好似是这么执行的;先把优先级最高的排在第一位,然后以优先级从低到高的顺序依次排在后面,就这样构成一个执行的列表。比如说以上面代码增加线程试验,如下public class b implements Runnable{
     void f(){
    try{
    Thread.sleep(1000);
    System.out.println("f()"+Thread.currentThread().getName());
    }catch(Exception e){e.printStackTrace();}
    }
    void g() throws Throwable{
    System.out.println("start");
    Thread t=new Thread(this,"a");
    t.setPriority(5);
    Thread t2=new Thread(this,"b");
    t2.setPriority(9);
    Thread t3=new Thread(this,"c");
    t3.setPriority(1);
    Thread t4=new Thread(this,"d");
    t4.setPriority(9);
    Thread t5=new Thread(this,"e");
    t5.setPriority(5);
    t.start();t2.start();
    t3.start();t4.start();t5.start();
    synchronized (this){Thread.sleep(500);}
    System.out.println("f()f");
    }
    synchronized public void run(){
    f();
    }
    public static void main(String[] args) throws Throwable {
    new b().g();
    }
    }
    结果服从最高优先级的b先出现,紧接着是最低优先级的c,然后是e、a、f、d,这里的f因为是主线程所以比ea的优先级要高,可是比d的9要低。而且貌似我也没有遇到过非此顺序的输出,疑惑中~~~到底是不是概率性的事儿啊~~
      

  2.   

    windows 和 liunx的优先级级别是不一样的
      

  3.   

    prority这个东西 确实不好用
      

  4.   

    因为主线程的优先级是5
    而5和6几乎是同一个级别的,所以区别没怎么明显,而且start方法需要准备的时间,所以6的时候很容易被主线程抢了cpu
    但是你将线程设置为7的时候,5和7就相差远了,所以,系统将会分配这个线程更多的时间和概率去争夺这个cpu
      

  5.   

    14楼说的有理!start()方法仅仅是使线程就绪,还要经过调度到运行态!此时系统当然要显示main主线程!
      

  6.   

    呃。。试了一下。。当同时在两个终端里面运行这个程序的时候顺序会乱掉。。在这样的情况下大概有一半的概率乱掉。。可是。。如果优先级是代表了运行的概率。。那么为啥有多个优先级的时候,除了最大优先级的那个是服从大概率出现的?其他的反而是反顺序来的?如果Java的优先级只是为了让程序员满足自己想要的线程执行概率的高低,那么这么搞不是不完整的满足?呃。。算咧。。优先级看来不是个好东东。。