多线程中不需要的输出

时间:2013-07-23 16:38:33

标签: java multithreading

class mythread implements Runnable {

    Thread t1;
    String name = "";

    public mythread(String thname) {
         name = thname;
         t1= new Thread(this, name);
         System.out.println(t1);
         t1.start();
         System.out.println(t1.getName());
     }
     @Override
     public void run() {
         for (int i=5;i>0;i--){
             try {
                System.out.println(Thread.currentThread());
                 System.out.println("child Thread" + i);
                 Thread.sleep(2000);
             }  catch(InterruptedException e){
                System.out.println("Child Thread Interrupted");
             }
         }
     }
}

public class Mainthread {
   public static void main(String[] args) {
        mythread m1 = new mythread("Rohan");
        mythread m2 = new  mythread("Jain");

        try {
            for(int i=5;i>0;i--){
                System.out.println("Main Thread" + i);
                 Thread.sleep(2000);
            }
        } catch(InterruptedException e){
            System.out.println("Main Thread Interrupted");
        }
    }
}

输出结果为:

Thread[Rohan,5,main]
Rohan
Thread[Jain,5,main]
Thread[Rohan,5,main]
child Thread5
Jain
Main Thread5
Thread[Jain,5,main]
child Thread5
Main Thread4
Thread[Rohan,5,main]
child Thread4
Thread[Jain,5,main]
child Thread4
Main Thread3
Thread[Rohan,5,main]
child Thread3
Thread[Jain,5,main]
child Thread3
Main Thread2
Thread[Jain,5,main]
Thread[Rohan,5,main]
child Thread2
child Thread2
Thread[Rohan,5,main]
child Thread1
Thread[Jain,5,main]
child Thread1
Main Thread1

但我想要的输出就像首先它应该在线程“rohan”中打印5,然后在“jain”中打印5,然后在线程“main”中打印5,依此类推......请帮助.. !!!! !!

3 个答案:

答案 0 :(得分:8)

这些问题让我很困惑。线程的全部意义在于它们并行运行异步,因此我们获得了更好的性能。由于硬件,竞争条件,时间切片随机性和其他因素,无法预测线程运行的顺序。任何询问线程程序中特定输出顺序的人都不应该使用线程。

以下是同一问题的类似答案:

答案 1 :(得分:2)

您可能希望在单个对象上使用锁来控制排序。有关详细信息,请参阅Java Thread Locks tutorial

答案 2 :(得分:0)

给予线程处理器时间或在OS级别调度。因此,您的程序无法直接控制指令在其自己的线程上执行的时间。所以现在有了订单的保证。有一些特定于操作系统的变量可用于调度。

如果您想保证跨线程的顺序,而不是线程需要进行通信。有几种方法可以做到这一点。最常见的程序员使用互斥锁;这也称为锁。