public class thread 
{
public static void main(String args[])
{
test a=new test();
new Thread(a).start();
new Thread(a).start();
new Thread(a).start();
}
}
class test extends Thread
{
int b=10;
//static Object obj=new Object();
synchronized void print()
{
System.out.println(Thread.currentThread().getName()+":"+b);
b--;
}
public void run()
{
while(b>0)
{
print();
try
{
sleep(1000);//如果换成2000,才能达到理想效果。为什么?
}
catch(Exception e){}

}
}
}

解决方案 »

  1.   

    sleep(1000)的结果
    Thread-1:10
    Thread-2:9
    Thread-3:8
    Thread-1:7
    Thread-2:6
    Thread-3:5
    Thread-3:4
    Thread-2:3
    Thread-1:2
    Thread-3:1
    我想输出这个结果
    Thread-1:10
    Thread-2:9
    Thread-3:8
    Thread-1:7
    Thread-2:6
    Thread-3:5
    Thread-1:4
    Thread-2:3
    Thread-3:2
    Thread-1:1
      

  2.   

    或者说,我想输出这个结果 
    Thread-1:10 
    Thread-2:9 
    Thread-3:8 
    Thread-1:7 
    Thread-2:6 
    Thread-3:5 
    Thread-1:4 
    Thread-2:3 
    Thread-3:2 
    Thread-1:1
    程序哪里需要改动..
      

  3.   

    是随机分配的,你可以试试用Join()。
      

  4.   

    那是因为你start了,启动的先后顺序却由不得你,jvm控制的,所以就设大点了
      

  5.   

    sleep时间不一定就是2000ms/1000ms,其中会有误差的。
      

  6.   

    用 synchronized 是等于上了一把锁
      本来线程的同步是一起抢占资源,你上锁了就说明把资源给固定的那个线程用
      

  7.   

    你这个运行结果都是有随机性,看系统的运行速度,除非你同步。才有一个固定的结果。你开始后,是JVM自动调用的。
     ··你当前的程序无法达到你的效果。解决方法前面有人给出了。同步。或者JOIN
      

  8.   

    你如果像看清楚效果的话  建议你在运行的时候去任务管理器里面选定你的程序 设置其为单cpu 现在很多计算机都是双cpu 了
    你的有些要求 在双核下是实现不了的
      

  9.   

    本人的一点理解,觉得同步是应该可以的,
    但join的话,不可能做到,因为join是等那个纯种完成才继续,所以123这样更替是达不到的~~
      

  10.   

    我用LZ的那个程序在eclipse调试了下,sleep1秒和sleep2秒程序结果都一样.所以不知道有什么问题!!!!!
      

  11.   

    为达到楼主的目标,不择手段:-)
    public class thread {
    public static void main(String args[]) {
    testsub a = new testsub();
    new Thread(a).start();
    new Thread(a).start();
    new Thread(a).start();
    }
    }class testsub extends Thread {
    int b = 10; synchronized void print() {
    if (b < 1) {
    return;
    }
    if (Thread.currentThread().getName().endsWith(
    String.valueOf(2 - b % 3 == 0 ? 3 : 2 - b % 3))) {
    System.out.println(Thread.currentThread().getName() + ":" + b);
    b--;
    }
    } public void run() {
    while (b > 0) {
    print();
    try {
    sleep(1000);
    } catch (Exception e) {
    }

    }
    }
    }
    红色标记的可以不要......
      

  12.   

    事情的起因是源于下面这样的一则广告贴(目前幸运还没有被删除,可以链接成功): 
    http://topic.csdn.net/u/20081028/15/525f32df-6c53-4b46-b847-f04c6fc1faf4.html 事情的发展是在这个贴: 我在移动平台专区被封权限是为什么?这个要找谁? 
    http://topic.csdn.net/u/20081118/08/cf7d0af3-35cc-4fb7-9dc2-4567041b89e5.html?seed=1367941736 事情的最新进展是这样的: [抗议]对硬件/嵌入开发的某些版主武断,简单,粗暴的执法方式表示严重的抗议!  
    http://topic.csdn.net/u/20081119/11/bda8bc5d-98d0-45ee-a1c1-86209d7f121d.html?seed=1457200066 当小贩被野蛮城管打死后之CSDN版 
    http://topic.csdn.net/u/20081120/09/8af968cb-af00-4ddb-8604-dab1fb5421be.html?seed=613093649 我重申一下,我一直不是在为我发广告贴辩护,我是在为处理此事的过程中受到的不合理对待即wxf0204 武断,简单,粗暴加野蛮的方式执法的行为,就我看跟城官差不多,对残踏我作为CSDN网友尊严,无视我作为CSDN网友存在的言行进行回击,悍卫我作为CSDN网友所具有的最基本的权利,而且之前连一个申诉的地方都没有,也没有找到班主封ID,删除留言的规定!别人城管也不会第一次去执法看到有小贩就直接打死,也会先劝导,就第一次收了别人小贩的东西也会开个条说一下情况,开个清单,收了什么,什么时候来取,要受到何种处罚,你们这帮斑猪不通人性,看到小贩直接毙了,之前之后,不声不响,不闻不问,不通人性,比城管还城管...................
    而且还不知反省,以暴抑暴,导致事件恶性循环!大家注意抗议的主题,不是对删除贴子,封ID有异议,对此贴前已经说的很清楚,现在的问题是抗议某些斑猪或者大部分斑猪在处理此事时粗暴的方式,野蛮的态度,狭隘的思想,如果在封ID之前给予警告,封ID之后对被封ID用户说明情况如确认被封的具体原因,封的时间以及当前所犯事件的严重程度等,事情何以至此,现在某些斑主为撑面子,继续执迷不悟,一点服务意识都没有,只会摆淫威! 再者跟城管没得比,别人城管之前还有警告,收了东西之后还要开个单子,通知什么时候去取回,有什么处罚,你们的粗野方式就是直接毙了,一了百了,跟原始人一样,难不成CSDN都是这样,真没人性化,我看别的论坛都是有流程,有说明,有警告,有通知!而且应该还有申诉的渠道,不能一手遮天,一毙完事,一点服务意识都没有,只会摆淫威! 
    知会一下,举手之劳,别的论坛都这么做......你们不这么做就是不通人性.........你自己想下,你这样野蛮,我为何要惧怕你的淫威,你以为你是谁,做错事直接闷棍打死,真正怎么死的都不知,...........不给没有前科的人以任何机会,手段之残忍,心恨之至极...........令人发指........让人不服,还不让辩解.....................,一点服务意识都没有,只会摆淫威 
    一点服务意识都没有,只会摆淫威
      

  13.   

    线程的调度跟操作系统有关,同步了结果才是固定的.
    并不是一调用start()方法就马上运行run()方法的