`
ayis
  • 浏览: 186335 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

java中线程到底什么时候启动

    博客分类:
  • java
阅读更多

线程到底什么时候启动呢?
有时候子线程马上就启动了,有时候在主线程执行了好多行代码之后子线程还三三两两的来启动几个。。。

按我的测试对子线程的启动有了一定认识,但我仍然觉得认识很肤浅,希望看到更深入的见解

/**
 * 测试线程什么时候启动。
 * 我的观点:
 * 1、调用线程的start()方法之后,就把线程放在等待队列之中,等待获得CPU时间片执行,
 * 但等待队列中的线程获得CPU时间并没有绝对的先后顺序,谁抢到了CPU,谁就先执行。
 * 2、如果在主线程中创建好了子线程之后,此时此刻我想让它们全部启动,我们就让主线程sleep(),
 * 睡眠的时间根据你估计所有的子线程启动需要的时间。如果只有简单的顺序执行代码的话,睡眠100毫秒就够了。
 * @author ayis
 *
 * Nov 29, 2008
 */
public class TestThreadWhenStart {
	
	public static void main(String args[]){
		try {
			
		System.out.println("测试开始!");
		
		testThreadStart();
		// 主线程睡眠足够长时间,让其它的线程都启动
		Thread.sleep(100);
		
		System.out.println("测试结束!");
			
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 启动5个子线程
	 */
	public static void testThreadStart(){
		
		for(int i=0 ; i< 5 ; i++){
			
			final int j=i;
			new Thread(
					new Runnable(){
						public void run(){
							System.out.println("线程: "+j+" 已启动!");
						}
					}
			).start();
			
		}
	}
	
}

  输出的结果是:

 

测试开始!
线程: 0 已启动!
线程: 2 已启动!
线程: 4 已启动!
线程: 1 已启动!
线程: 3 已启动!
测试结束!

 

如果注释掉Thread.sleep(100),再次执行,就出现这样的结果:

 

测试开始!
线程: 0 已启动!
线程: 2 已启动!
线程: 1 已启动!
测试结束!
线程: 3 已启动!
线程: 4 已启动!

 

有子线程在主线程结束之后才启动。如果让主线程睡眠一下,再执行,(就是代码中的情况),就能保证在子线程都启动后,主线程才继续执行。

 

正是上面所说的很肤浅,大家多批评批评

分享到:
评论
13 楼 shikonglaike 2009-01-20  
gembler 写道
njuptsoz 写道
icyiwh 写道

结果是正常的如果没有休眠时间则运行过程如下:主线程启动(Main)的执行和子线程的执行在时间上是并行的,不是串行的"测试已结束!"这句可以出现在任何一个子线程的启动之前或者启动之后

同意


同意,too。
这种并行情况下,结果是因环境而异。


我也同意这个观点。
12 楼 javatestoracle 2009-01-20  
main() 是一个特殊的线程,java虚拟机会自己动认出来,其他的线程是子线程,主线程和子线程个走个的,很有可能主线程已经结束,但是子线程还在运行的情况
11 楼 tinyyea 2009-01-14  
哈,你根本没有办法知道!

当你new一个线程的时候实例化了一个线程,当你start的时候,操作系统也要为它准备资源,然后把它丢到就绪队列里,即便等到当前在CPU的线程让出之后,你这个线程也不一定能立刻运行,操作系统要经历复杂的思想过程(调度算法),直到它认为该你运行了,你就start了。
好像在很多情况先start的线程会先运行,不过这只是好像,可能和先来先服务有关,呃,《操作系统》全忘光了。。
10 楼 xxdneu 2009-01-13  
应该用join 来保证子线程执行完吧
9 楼 mercyblitz 2008-12-13  

这个问题比较复杂,Thread#sleep方法的语意和执行循序无关,

usiboy 写道

你在testThreadStart(); 加一个线程锁,比如synchronized(this){testThreadStart();&nbsp; } 把Thread.sleep(100)注释掉,你看看效果是不是和原来的一样。这样做的目的是保证同步。


  同步和执行顺序没有没有关系,同步的语意是防止Data Racing,而不是执行循序,顺序和JVM的实现有关系,JVM针对不同的CPU的做法不一,我做过AMD和Intel的测试,同样的代码在上面表现不同,并且更为重要的事情是单核的CPU不能做到微观并行,而多核CPU可以做到。

  在google 上面搜索一下 Java Memory Model Reorder吧!
8 楼 timerri 2008-12-05  
用sleep可保证不了什么,特别是在子线程优先级低的情况下。
还是要用信号量
7 楼 xuyao 2008-12-05  
这个不是你控制的,由虚拟机自己决定,你调用start,线程就会进入“就绪状态”但是不一定立刻被执行。建议去找本java将线程的书仔细看下。
6 楼 ayis 2008-12-01  
usiboy 写道

你在testThreadStart(); 加一个线程锁,比如synchronized(this){testThreadStart();&nbsp; } 把Thread.sleep(100)注释掉,你看看效果是不是和原来的一样。这样做的目的是保证同步。

这样同步怎么了呢,貌似没用
5 楼 BenoWay 2008-12-01  
主线程只负责说,诶,你可以开始了,并不知道子线程什么时候开始。
4 楼 usiboy 2008-12-01  
你在testThreadStart(); 加一个线程锁,比如synchronized(this){testThreadStart();  } 把Thread.sleep(100)注释掉,你看看效果是不是和原来的一样。这样做的目的是保证同步。
3 楼 gembler 2008-11-29  
njuptsoz 写道
icyiwh 写道

结果是正常的如果没有休眠时间则运行过程如下:主线程启动(Main)的执行和子线程的执行在时间上是并行的,不是串行的"测试已结束!"这句可以出现在任何一个子线程的启动之前或者启动之后

同意


同意,too。
这种并行情况下,结果是因环境而异。
2 楼 njuptsoz 2008-11-29  
icyiwh 写道

结果是正常的如果没有休眠时间则运行过程如下:主线程启动(Main)的执行和子线程的执行在时间上是并行的,不是串行的"测试已结束!"这句可以出现在任何一个子线程的启动之前或者启动之后

同意
1 楼 icyiwh 2008-11-29  
结果是正常的

主线程启动(Main)的执行和子线程的执行在时间上是并行的,不是串行的
"测试已结束!"这句可以出现在任何一个子线程的启动之前或者启动之后

相关推荐

    多线程启动.java多线程启动.java多线程启动.java

    多线程启动.java多线程启动.java多线程启动.java多线程启动.java

    java多线程编程总结

    Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-...

    java多线程笔记

    Java线程:创建与启动 7 Java线程:线程名称的设定及获取 10 Java线程:线程栈模型与线程的变量 12 Java线程:线程的调度-休眠 13 Java线程:线程的调度-优先级 16 Java线程:线程的调度-让步 19 Java线程:线程的...

    Java多线程编程总结

    Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程...

    JAVA 线程中启动线程

    JAVA 线程中启动线程,自己写的一个demo,欢迎参考

    java 启动线程的资源

    java 启动线程 java 启动线程 java 启动线程

    java 多线程设计模式 进程详解

    《Java线程 高清晰中文第二版》中文第二版(PDF) 前言 第一章 线程简介 Java术语 线程概述 为什么要使用线程? 总结 第二章 Java线程API 通过Thread类创建线程 使用Runable接口的线程 线程的生命周期 线程命名 ...

    Java多线程调用BlockingDeque跑批量数据的例子

    N个线程从队列中取出数据,找到其在子表中的数据 对子表中的数据开3种线程:读,发email,标记状态 N个线程对完成的A表数据做最后处理 支持大数据量跑批,就是个例子,本来是公司发送促销邮件用的,欢迎提意见和建议...

    java线程定时启动

    本文档 描述怎样定时 启动一个线程任务 并加了注释 希望对你有帮助

    java多线程每个线程挨着打印ABC的4种实现方式

    java多线程每个线程挨着打印ABC的4种实现方式,有4个线程t1、t2、t3、t4,t1打印A后t2打印A再t3打印A再t4打印A,然后从新回到t1打印B再t2打印B...t4打印B... 4个线程轮流打印abc... 一个线程可以理解为一个人,打印...

    java多线程示例

    Java中的多线程有三种实现方式: 1.继承Thread类,重写run方法。Thread本质上也是一个实现了Runnable的实例,他代表一个线程的实例,并且启动线程的唯一方法就是通过Thread类的start方法。 2.实现Runnable接口,并...

    Java 线程总结

    Java线程:创建与启动 Java线程:线程栈模型与线程的变量 Java线程:线程状态的转换 Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-...

    java多线程设计模式详解(PDF及源码)

    本书浅显易懂的介绍了JAVA线程相关的设计模式,通过程序范例和UML图示来一一解说,书中代码的重要部分加了标注以使读者更加容易理解,再加上图文并茂,对于初学者还是程序设计高手来说,这都是一本学习和认识JAVA...

    java应用程序中使用线程

    锁定排序 3.6 线程优先级 3.7 监控程序线程 3.8 在应用程序中加入线程 3.9 线程控制 3.9.1 线程启动 3.9.2 线程休眠 3.9.3 线程挂起 3.9.4 线程恢复 3.9.5 线程停止 3.9.6...

    java线程文档

     Java编写程序都运行在在Java虚拟机(JVM)中,在JVM的内部,程序的多任务是通过线程来实现的。每用java命令启动一个java应用程序,就会启动一个JVM进程。在同一个JVM进程中,有且只有一个进程,就是它自己。在这个...

    java多线程编程教程

    Java线程是Java语言中一个非常重要的部分,Java5之前,多线程的语言支持还是比较弱的,内容也较少,写一个复杂的多线程程序是相当有挑战性的。 在Java5以后,Java对多线程做了很多扩展,扩展部分称之为并发包。这...

    java线程的创建于启动

    java线程的创建于启动,适合初学者学习,讲述的还算比较详细。

    java线程详解

    Java线程:创建与启动 Java线程:线程状态的转换 Java线程:线程的同步与锁 一、同步问题提出 二、同步和锁定 三、静态方法同步 四、如果线程不能不能获得锁会怎么样 五、何时需要同步 六、线程安全类 七、...

Global site tag (gtag.js) - Google Analytics