关于java多线程调用出问题

qjf_Troy 发布于 2014/02/18 22:14
阅读 366
收藏 0

时间长没看java多线程了,结果写了个例子但是输出结果好像不太对

package com.Thread;

public class SingleThread {
	public static void main(String[] args) {
		new Test().start();
		
		for (int i = 0; i < 5; i++) {
			System.out.println("main method");
		}
	}
}
class Test extends Thread{
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for (int i = 0; i < 5; i++) {
			System.out.println("Thread test");
		}
	}
}

这个是我的代码运行结果

 

 

但是按理说正常的结果应该是这两个交替输出的例如:

但是我看我的代码也是和例子一样的呀,怎么结果就差了呢,另外我要是通过实现Runnable接口实现效果还是一样,这是怎么回事呢。

加载中
0
巴顿
巴顿
/**
 *@description 
 *@author liangzhenghui
 *@date Feb 19, 2014
 */
public class SingleThread {
	public static void main(String[] args) {
		new Test().start();
		
		for (int i = 0; i < 100; i++) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println("main method");
		}
	}
}
class Test extends Thread{
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for (int i = 0; i < 100; i++) {
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			System.out.println("Thread test");
		}
	}
}



巴顿
巴顿
回复 @qjf_swallretu : A,B线程,A睡觉的时候,B就去干活了,B干完活的时候去睡觉。A醒了A去干活。
qjf_Troy
qjf_Troy
回复 @Brin想写程序 : 嗯,谢谢了
Brin想写程序
Brin想写程序
回复 @qjf_swallretu : 因为sleep其实是告诉CPU,当前进程放弃时间片。所以sleep后,然后所有线程再进入线程抢占。
qjf_Troy
qjf_Troy
为什么线程睡眠之后就会出现交替的现象呢。
0
悠悠然然
悠悠然然

乱弹

两个线程运行只是说可能交叉输出没有说一定。

你的循环次数太少了,都改成50000000,试试看。

就会交叉了。

0
天天天
天天天
ConcurrentLinkedQueue
0
专业打酱油
专业打酱油

你在test的run方法中的for里,sleep几十毫秒,试试吧

交替进行这个是有可能的,但是不是绝对的。。。

如果你只有一个cpu,还是先别测试多线程了。。

你真得从头看看了。。。

其实你需要的是计算机原理,和java无关

qjf_Troy
qjf_Troy
谢谢
0
黑风山大寨主
黑风山大寨主
两个问题导致串行,不能直接new Test().start(), 循环数5太小。
0
qjf_Troy
qjf_Troy

引用来自“白马赵客”的答案

两个问题导致串行,不能直接new Test().start(), 循环数5太小。

不能直接使用new Test().start()方法吗?这是为啥呢,我是通过继承来实现的呀。

黑风山大寨主
黑风山大寨主
不好意思我搞错了,我本意是说应该是Test test = new Test(); test.start();不能直接一句写成new Test().start();不过这是错的,你的问题就是迭代数字太小了,你放到1000甚至再大就可以看到两个线程并行运行了,又或者Thread.sleep(1000)一下就可以看到你想要的结果。
0
巴顿
巴顿
main method
Thread test
main method
Thread test
main method
Thread test
main method
Thread test
Thread test
main method
main method
Thread test
Thread test
main method
Thread test
main method
main method
Thread test
Thread test
main method
main method
Thread test
main method
Thread test
Thread test
main method
Thread test
main method
main method
Thread test
main method
Thread test
Thread test
main method
main method
Thread test
main method
Thread test
Thread test
main method
main method
Thread test
main method
Thread test
Thread test
main method
main method
Thread test
Thread test
main method
main method
Thread test
Thread test
main method
main method
Thread test
main method
Thread test
Thread test
main method
main method
Thread test
main method
Thread test
main method
Thread test
main method
Thread test
main method
Thread test
Thread test
main method
Thread test
main method
main method
Thread test
Thread test
main method
main method
Thread test
Thread test
main method
Thread test
main method
main method
Thread test
Thread test
main method
main method
Thread test
main method
Thread test
main method
Thread test
Thread test
main method
Thread test
main method

0
YiYang
YiYang
线程至少有3个,JVM线程,主线程,自启动线程,每个线程执行有可能阻塞而挂起,其他线程在工作,所以每次线程执行的结果是不一样的
YiYang
YiYang
@qjf_swallretu jvm与main是不同线程
qjf_Troy
qjf_Troy
jvm线程和main线程不是同一个吗?那jvm的线程可以调用吗
返回顶部
顶部