我正在尝试这个代码,我对我得到的输出感到有点困惑/惊讶。我还是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();
}
答案 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循环无所事事一百万次。