如何使Java中的线程同时运行

时间:2013-08-03 14:46:51

标签: java multithreading concurrent-programming

我正在尝试这个代码,我对我得到的输出感到有点困惑/惊讶。我还是Java新手,但我知道线程通常应该同时运行。看来我的“printB”线程在开始执行之前等待“printA”线程。我已经多次运行该程序(希望得到两个线程结果的混合,即类似:a,a,b,a,b,a ......)但仍然得到相同的输出(即“A”在“B”之前先打印。为什么会发生这种情况?如何更改代码以开始正常运行?

非常感谢任何意见/建议。感谢。

另外,我正在使用extends Thread方法尝试相同的代码,但它不起作用。

class PrintChars implements Runnable{
    private char charToPrint;
    private int times;

    public PrintChars(char c, int t){
        charToPrint = c;
        times = t;        
    }


    public void run(){
        for (int i=0; i<times; i++)
        System.out.println(charToPrint);        
    }


    public static void main(String[] args){

        PrintChars charA = new PrintChars('a', 7);
        PrintChars charB = new PrintChars('b', 5);

        Thread printA = new Thread(charA);
        Thread printB = new Thread(charB);

        printA.start();
        printB.start();
    }
}

扩展下面的Thread方法:

class PrintChars extends Thread {

private Char charToPrint;
private int times;


public PrintChars(char c, int t){
    charToPrint = c;
    times = t;
}


public void run (){

    for(int i =0; i<times; i++)
            System.out.println(charToPrint);
    }

    PrintChars printA = new PrintChars('a', 7);
    PrintChars printB = new PrintChars('a', 5);

    printA.start();
    printB.start();
}  

6 个答案:

答案 0 :(得分:6)

在多线程中,通常你不能对输出进行任何假设。

也许用于创建线程的时间很长,因此前一个线程有时间完全完成,因为它的执行时间非常短。

尝试使用7000和5000而不是7和5。

答案 1 :(得分:4)

每个线程都需要一些时间来启动,并且可以非常快速地完成运行。我建议您在每行打印后添加Thread.sleep(500);

try {
    for(int i =0; i<times; i++) {
        System.out.println(charToPrint);
        Thread.sleep(500);
    }
} catch(InterruptedException ie) {
}

答案 2 :(得分:2)

线程调度不是确定性的。操作系统安排一个线程完全没问题,并且只在第一个线程完成后安排第二个线程。

如果从操作系统的角度考虑它,那就有意义了。如果有人要求你做两个任务,那么做一个然后另一个可能更有效。

当任务执行时间太长时,作为操作系统,您可能希望任务切换并对其他任务执行某些操作,否则其他任务根本不会进展,以及应用程序。发出任务的人会感到受到歧视。

您可以通过延长任务时间来查看此内容,例如:通过添加Thread.sleep语句或计算PI或其他东西(或只是循环超过7,如70000)。

答案 3 :(得分:2)

我认为你的线程的执行时间太短而无法注意到效果。您可以为times尝试更高的值。我会尝试一些>10000。另一个选择是通过使方法更慢来增加执行时间:

public void run(){
    for (int i = 0; i < times; i++) {
      System.out.println(charToPrint); 
      try {
        Thread.sleep(500);
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }
}

答案 4 :(得分:2)

尝试再运行几次。当我用700/500尝试时,我注意到了一些交织。

答案 5 :(得分:1)

你的代码只是表现正常,如果你的期望是打印a和b的混合,那么你应该充分打印chars而不是几次,或者使用Thread.sleep()或者忙着等待运行for循环无所事事一百万次。