我想实现这样的线程执行顺序我是安装工人1,我现在开始装底盘
sleep5000
底盘装好了,下面继续
我是安装工人2,我现在开始装轮胎
sleep5000
轮胎装好了,下面继续
我是安装工人3,我现在开始装车壳
sleep5000
车壳装好了,发现轮胎有问题,请安装工人2前来修理
我是安装工人2,我来修理轮胎
sleep5000
我是安装工人2,轮胎修理好了
这辆汽车完工了程序是这样写的public class ThreadMeTest
{ public static void main(String[] args)
{
          carmen t1=new carmen("安装工人1","底盘");
          carmen t2=new carmen("安装工人2","轮胎");
          carmen t3=new carmen("安装工人3","车壳");
          t1.start();
          System.out.println("底盘装好了,下面继续");
          t2.start();
          System.out.println("轮胎装好了,下面继续");
          t3.start();
          System.out.println("车壳装好了,发现轮胎有问题,请安装工人2前来修理");
          System.out.println("我是安装工人2,我来修理轮胎");
          try {
t2.join();
Thread.sleep(5000);
System.out.println("我是安装工人2,轮胎修理好了");

} catch (InterruptedException e) {

e.printStackTrace();
}
System.out.println("这辆汽车完工了");
}}class carmen extends Thread
{
String things;
public carmen(String name,String things)
{
super(name);
this.things=things;
System.out.println("我是"+getName()+","+"开始安装"+things);
} public void run() 
{

try {
Thread.sleep(5000);
} catch (InterruptedException e) {

e.printStackTrace();
}
System.out.println("我是"+getName()+","+things+"装好了");
}
}可运行结果是
我是安装工人1,开始安装底盘
我是安装工人2,开始安装轮胎
我是安装工人3,开始安装车壳
底盘装好了,下面继续
轮胎装好了,下面继续
车壳装好了,发现轮胎有问题,请安装工人2前来修理
我是安装工人2,我来修理轮胎
我是安装工人2,轮胎装好了
我是安装工人1,底盘装好了
我是安装工人3,车壳装好了
我是安装工人2,轮胎修理好了
这辆汽车完工了为什么会这样,哪出错了,麻烦各位了

解决方案 »

  1.   

    后来我把程序改成这样就行了,那这样这个run方法不是没用了么
    public class ThreadMeTest
    { public static void main(String[] args)
    {
              carmen t1=new carmen("安装工人1","底盘");
              carmen t2=new carmen("安装工人2","轮胎");
              carmen t3=new carmen("安装工人3","车壳");
             // t1.setPriority(10);
              t1.start();
              //System.out.println("底盘装好了,下面继续");
             // t2.setPriority(6);
              t2.start();
             //System.out.println("轮胎装好了,下面继续");
             // t3.setPriority(5);
              t3.start();
             System.out.println("车壳装好了,发现轮胎有问题,请安装工人2前来修理");
              System.out.println("我是安装工人2,我来修理轮胎");
              try {
    t2.join();
    Thread.sleep(5000);
    System.out.println("我是安装工人2,轮胎修理好了");

    } catch (InterruptedException e) {

    e.printStackTrace();
    }
    System.out.println("这辆汽车完工了");
    }}class carmen extends Thread
    {
    String things;

    public carmen(String name,String things)
    {
    super(name);
    this.things=things;
    System.out.println("我是"+getName()+","+"开始安装"+things);
    try {
    Thread.sleep(5000);
    System.out.println("我是"+getName()+","+things+"装好了");
    } catch (InterruptedException exception) {

    exception.printStackTrace();
    }
    } public void run() 
    {



    }
    }
      

  2.   


    public static void main(String[] args) throws Exception {
    carmen t1 = new carmen("安装工人1","底盘");
    carmen t2 = new carmen("安装工人2","轮胎");
    carmen t3 = new carmen("安装工人3","车壳");
    t1.start();
    t1.join();
    System.out.println("底盘装好了,下面继续");
    t2.start();
    t2.join();
    System.out.println("轮胎装好了,下面继续");
    t3.start();
    t3.join();
    System.out.println("车壳装好了,发现轮胎有问题,请安装工人2前来修理");
    System.out.println("我是安装工人2,我来修理轮胎");
    t2.join();
    Thread.sleep(5000);
    System.out.println("我是安装工人2,轮胎修理好了");
    System.out.println("这辆汽车完工了");
    }
      

  3.   


    public class TestThreadOrder { public static void main(String[] args) {
    Carmen t1 = new Carmen("安装工人1", "底盘");
    Carmen t2 = new Carmen("安装工人2", "轮胎");
    Carmen t3 = new Carmen("安装工人3", "车壳");
    t1.start();
    t2.start();
    t3.start();
    }
    }class Carmen extends Thread {
    public String things;
    public Carmen cmen = null; public Carmen(String name, String things) {
    super(name);
    this.things = things;
    } public String getThings() {
    return things;
    } public static synchronized void report(String name, String things,
    Carmen cmen) {
    System.out.println("我是" + name + "," + "开始安装" + things);
    try {
    Thread.sleep(5000);
    } catch (InterruptedException e) { e.printStackTrace();
    }
    System.out.println(things + "装好了,下面继续!");
    } public void run() {
    report(getName(), things, cmen);
    }
    }
      

  4.   

    这个程序显然应该使用LinkedBlockingQueue,这样会很简单
    new一个car
    new 3个LinkedBlockingQueue分别放1:装上底盘的car2:装上底盘后装上轮胎的car,3:装上底盘,轮胎后,装上车壳的car
    3个线程
    Thread1:装底盘,装好后放入LinkedBlockingQueue1
    Thread2:装轮胎,先从LinkedBlockingQueue1中拿出一个car,然后装轮胎,然后放进LinkedBlockingQueue2
    Thread3:装车壳,先从LinkedBlockingQueue2中取出一个car,装车壳,然后放入LinkedBlockingQueue3,这个BlockingQueue种放的就是最后的成品了
    呵呵,思路给说了,LZ自己敲一下代码吧
      

  5.   

       楼主没有理解cup多线程的调度过程。 t1.start(); 之后并不是马上的去执行线程t1,
    必须等到main线程的时间片结束之后,才去执行t1,t2,t3线程,这决定于他们的线程优先级。。
        楼主的第一个程序为什么没有得到想要的执行结果?   
    问题出在这里:t2.join()是该线程终止,直到t2线程终止之后才被唤醒。所以main线程要想打印'
    '我是安装工人2,轮胎修理好了 ',必须要在t2线程执行完之后才能,被唤醒执行。
       楼主修改后的程序为什么能达到你所要的效果?
      因为这时,你把打印语句写在构造法方法里,在你实例化对象之后,就被调用了,也是在main线程当中去执行的所以,顺序就是按照你想要的打印。