请教java线程问题

来源:百度知道 编辑:UC知道 时间:2024/06/16 01:19:09
class NewLine extends Thread{
public void run(){
for(int i=1;i<=10;i++){
System.out.println();
try{
sleep(1000);
}catch (InterruptedException ie){}
}
}
}
public class k002 extends Thread{
public void run(){
for(int i=1;i<=100;i++){
System.out.print(i);
try{
sleep(100);
}catch(InterruptedException ie){}
}
}

public static void main(String [] args){
k002 t=new k002();
NewLine n=new NewLine();
t.start();
n.start();
}

运行结果:
1
2345678910
11121314151617181920
21222324252627282930
31323334353637383940
41424344454647484950
51525354555657585960
61626364656667686970
71727374757677787980
81828384858687888990
919293949596979899100

在这里第一行为什么不是12345678910而是1 ??

t.start();开启了一个新的线程,此时又两个线程:
1.本身的main方法,2.你刚开启的线程,暂时叫线程1
当打印出了1,证明是你新开的线程中的System.out.print(i);执行了,而它下面的语句是sleep(100); ,所以只剩下一个线程,那就是main
这时main继续执行n.start(); 又开启一个新线程,此时又是有两个线程,线程1和新开启的线程,暂时叫线程2,main线程执行完了。而在线程2里你执行的是:System.out.println(); //换行
sleep(1000);所以又回到线程1,打印i,而此时i通过for循环+1所以打印的是2,再sleep(100);但此时线程2还在sleep,所以100毫秒以后还是线程1执行,因为你设置的是线程2:sleep(1000); 我想你应该能看懂

public void run(){
for(int i=1;i<=10;i++){
System.out.println();

你空写了一个打印语句, println是回车换行。
所以 你的1-10 在1的时候被换行了,没看到你的第二行第一个是2开头么

你在你的里面的线程方法前面加上synchronized
public synchronized void run() {
试试

呃,二楼应该是正确的。