1

我正在尝试这段代码,我对得到的输出有点困惑/惊讶。我还是 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();
}  
4

6 回答 6

6

在多线程中,通常您不能对输出做出任何假设。

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

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

于 2013-08-03T14:49:35.567 回答
4

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

try {
    for(int i =0; i<times; i++) {
        System.out.println(charToPrint);
        Thread.sleep(500);
    }
} catch(InterruptedException ie) {
}
于 2013-08-03T14:51:14.733 回答
2

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

如果您从操作系统的角度考虑,这是有道理的。如果有人要求您执行两项任务,则先执行一项然后执行另一项可能更有效。

当任务执行时间过长时,作为操作系统,您可能希望切换任务并在其他任务上执行某些操作,否则其他任务将根本无法进行,并且应用程序。那个下达的任务会感觉受到歧视。

你可以通过让你的任务运行更长的时间来看到这一点,例如通过添加Thread.sleep语句或计算 PI 或其他东西(或者只是循环超过 7,比如 70000)。

于 2013-08-03T14:50:30.090 回答
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();
      }
    }
}
于 2013-08-03T14:51:27.193 回答
2

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

于 2013-08-03T14:53:11.667 回答
1

您的代码仅表现正常,如果您的期望是打印 a 和 b 的混合,那么您应该充分打印字符而不是几次,或者使用 Thread.sleep() 或忙等待运行 for 循环什么都不做一百万次。

于 2013-08-03T16:21:49.747 回答