刚刚在学JAVA多线程的内容,正在学习setPriority()方法的使用,却碰到了一些问题,先上代码:代码目的是建立两个线程,设置他们不同的优先级,然后启动这两个线程,向同一个StringBuffer中添加内容,最后打印出StringBuffer中的内容。线程代码:public class Base extends Thread {
 public static StringBuffer log=new StringBuffer();
 private int i;  public void run()
 {
  for(i=1;i<=100;i++)
  {
  log.append( (Thread.currentThread()).getName()+":"+i+" ");
  if(i%10==0)
  {
  log.append("\n");
  }
  }
 }主函数:public class Test {    public static void main(String[] args) throws Exception {
        Base b1=new Base();
        Base b2=new Base();        b1.setName("b1");
        b2.setName("b2");        b1.setPriority(Thread.MAX_PRIORITY);
        b2.setPriority(Thread.MIN_PRIORITY);        b1.start();
        b2.start();        b1.join();
        b2.join();
        System.out.println(Base.log);    }
}照理说我设置了b1线程的优先级高于b2,应该优先运行b1线程放log中添加内容,然后才是b2,但结果却是两个线程几乎就是交替运行,看不出优先关系:b1:1 b1:2 b1:3 b2:1 b1:4 b2:2 b1:5 b2:3 b1:6 b2:4 b1:7 b2:5 b1:8 b2:6 b1:9 b2:7 b1:10 
b2:8 b1:11 b2:9 b1:12 b2:10 
b1:13 b2:11 b1:14 b2:12 b1:15 b2:13 b1:16 b2:14 b1:17 b2:15 b1:18 b2:16 b1:19 b2:17 b1:20 
b2:18 b1:21 b2:19 b1:22 b2:20 
b1:23 b2:21 b1:24 b2:22 b1:25 b2:23 b1:26 b2:24 b1:27 b2:25 b1:28 b2:26 b1:29 b2:27 b1:30 
b2:28 b1:31 b2:29 b1:32 b2:30 
b1:33 b2:31 b1:34 b2:32 b1:35 b2:33 b1:36 b2:34 b1:37 b2:35 b1:38 b2:36 b1:39 b2:37 b2:38 b1:40 
b2:39 b1:41 b2:40 
b1:42 b2:41 b1:43 b2:42 b1:44 b2:43 b1:45 b2:44 b1:46 b2:45 b1:47 b2:46 b1:48 b2:47 b1:49 b2:48 b1:50 
b2:49 b1:51 b2:50 
b1:52 b2:51 b1:53 b2:52 b1:54 b2:53 b1:55 b2:54 b1:56 b2:55 b1:57 b2:56 b1:58 b2:57 b1:59 b2:58 b1:60 
b2:59 b1:61 b2:60 
b1:62 b2:61 b1:63 b2:62 b1:64 b2:63 b1:65 b2:64 b1:66 b2:65 b2:66 b1:67 b1:68 b2:67 b1:69 b2:68 b1:70 
b1:71 b2:69 b1:72 b2:70 
b1:73 b1:74 b2:71 b1:75 b2:72 b1:76 b1:77 b2:73 b1:78 b2:74 b1:79 b1:80 
b2:75 b1:81 b2:76 b1:82 b1:83 b2:77 b1:84 b2:78 b1:85 b2:79 b1:86 b1:87 b1:88 b1:89 b1:90 
b2:80 
b1:91 b2:81 b1:92 b2:82 b1:93 b2:83 b1:94 b2:84 b1:95 b2:85 b1:96 b2:86 b1:97 b2:87 b1:98 b2:88 b1:99 b2:89 b1:100 
b2:90 
b2:91 b2:92 b2:93 b2:94 b2:95 b2:96 b2:97 b2:98 b2:99 b2:100 有哪位知道这是为啥?和我的操作系统有关?我用的是win7+i5处理器。
求助各位大神了噢!

解决方案 »

  1.   

    LZ可以参考1L的见解,构造复杂点的例子,增加一些互斥操作的资源,试试
      

  2.   

    可能教材写的时候,CPU性能还没现在这么高
    另外,尽信书不如无书,是吧~
      

  3.   

    楼上的解释啊啊。。那么说国内教科书上的例子太坑啦,按照书上的例子的演示,设置了高的优先级就会优先运行~~哎,杯具。楼上的解释都是错的,哥们。这个原因并不是优先级失效了,而是因为你的处理器是多核的。
    这段代码在单核CPU上一定是先B1后B2的,但是现在处理器都是多核的,多核CPU是可以真正实现多个线程同时运行的,而不是简单的快速切换的假象,每个核心都能够负责一个线程。你可以把你的CPU核心关掉一些,只留下一个核心工作,再运行这个。关闭多核CPU核心的方法:
    开始,运行,输入:MSCONFIG再点  BOOT.INI 找到高级选项,点开 /NUMPROC9(N)= 里面只选1就关掉另外的核了,如果你是四核,里面有1 2 3 4可选,点2就是只能当双核用,以此类推。下面是我关成一个核心后的运行结果:
    b1:1 b1:2 b1:3 b1:4 b1:5 b1:6 b1:7 b1:8 b1:9 b1:10 
    b1:11 b1:12 b1:13 b1:14 b1:15 b1:16 b1:17 b1:18 b1:19 b1:20 
    b1:21 b1:22 b1:23 b1:24 b1:25 b1:26 b1:27 b1:28 b1:29 b1:30 
    b1:31 b1:32 b1:33 b1:34 b1:35 b1:36 b1:37 b1:38 b1:39 b1:40 
    b1:41 b1:42 b1:43 b1:44 b1:45 b1:46 b1:47 b1:48 b1:49 b1:50 
    b1:51 b1:52 b1:53 b1:54 b1:55 b1:56 b1:57 b1:58 b1:59 b1:60 
    b1:61 b1:62 b1:63 b1:64 b1:65 b1:66 b1:67 b1:68 b1:69 b1:70 
    b1:71 b1:72 b1:73 b1:74 b1:75 b1:76 b1:77 b1:78 b1:79 b1:80 
    b1:81 b1:82 b1:83 b1:84 b1:85 b1:86 b1:87 b1:88 b1:89 b1:90 
    b1:91 b1:92 b1:93 b1:94 b1:95 b1:96 b1:97 b1:98 b1:99 b1:100 
    b2:1 b2:2 b2:3 b2:4 b2:5 b2:6 b2:7 b2:8 b2:9 b2:10 
    b2:11 b2:12 b2:13 b2:14 b2:15 b2:16 b2:17 b2:18 b2:19 b2:20 
    b2:21 b2:22 b2:23 b2:24 b2:25 b2:26 b2:27 b2:28 b2:29 b2:30 
    b2:31 b2:32 b2:33 b2:34 b2:35 b2:36 b2:37 b2:38 b2:39 b2:40 
    b2:41 b2:42 b2:43 b2:44 b2:45 b2:46 b2:47 b2:48 b2:49 b2:50 
    b2:51 b2:52 b2:53 b2:54 b2:55 b2:56 b2:57 b2:58 b2:59 b2:60 
    b2:61 b2:62 b2:63 b2:64 b2:65 b2:66 b2:67 b2:68 b2:69 b2:70 
    b2:71 b2:72 b2:73 b2:74 b2:75 b2:76 b2:77 b2:78 b2:79 b2:80 
    b2:81 b2:82 b2:83 b2:84 b2:85 b2:86 b2:87 b2:88 b2:89 b2:90 
    b2:91 b2:92 b2:93 b2:94 b2:95 b2:96 b2:97 b2:98 b2:99 b2:100 
      

  4.   

    好了,找到调回去的方法了。MSCONFIG,常规,选择正常启动。另外找到个安全点的限制单核运行测试的方法,在任务管理器里选择eclipse进程,右键选择相关性,只勾选一个CPU。
    这样测试比较简单,不会影响系统,而且不用重启,测完记得改回去。