java线程类Thread中的方法

线程类Thread中的方法

	1)currentThread():
		public static Thread currentThread()
		说明:返回当前正在执行的线程对象的引用,即返回调用当前代码的线程对象。
		
		
	2) join():
		public final void join(long millis) throws InterruptedException
		参数:等待的时间,可选,不填则默认为0。
		说明:
			1>强制运行调用join方法的线程,在该线程启动后的millis毫秒内,其它线程无法运行。
			2>如果millis的值为0,则表示在该线程运行期间,其它线程无法运行,必须等到该线程结束后其它线程才可以运行。
			3>join(long)方法是在内部调用wait(long)方法来实现的等待效果。
		
		
	3)setDaemon():
		public final void setDaemon(boolean on)
		说明:将该线程标记为后台线程,该方法必须在启动线程(start()方法)前调用,否则报IllegalThreadStateException异常。 
		补充:
			后台线程:处于后台运行,任务是为其他线程提供服务。也称为“守护线程”或“精灵线程”。JVM的垃圾回收就是典型的后台线程。
			特点:
				1>若所有的前台线程都死亡,后台线程自动死亡。
				2>前台线程创建的线程默认是前台线程。
				
		isDaemon():
			public final boolean isDaemon()
			说明:判断是否为后台线程:
			
			
	4)sleep():
		public static void sleep(long millis) throws InterruptedException
		说明:让当前正在执行的线程休眠(暂停)指定的毫秒数,进入阻塞状态			
		比较:Thread.sleep()与Object.wait()二者都可以暂停当前线程,释放CPU控制权,主要的区别在于Object.wait()在释放CPU同时,释放了持有的对象锁。	
		
		
	5)yield():
		public static void yield()
		说明:暂停当前正在执行的线程对象,并执行其他线程,即线程礼让。
		注意:暂停当前线程,但不会阻塞该线程,而是让其进入就绪状态。故完全有可能:某个线程调用了yield()之后,线程调度器又把他调度出来重新执行。
		
		
	6)interrupt():
	
		说明:
			1)每个线程都有一个boolean类型的中断标志,当一个线程调用interrupt()方法时,线程的中断标志将被设为true,此时线程处于中断状态。
			2)调用线程的interrupt()方法只是将线程的中断标记设为了true,并不会中断一个正在运行的线程。
			3)如果在程序中没有去检测线程的中断标志,那么即使将线程的中断标志设为true,线程也一样照常运行。
			
		应用:
			1)当线程调用Thread.sleep()、Thread.join()、object.wait()等方法,都会使当前线程进入到阻塞状态。
			2)如果此时(线程处于阻塞状态)调用interrupt()方法将线程中断,则处于阻塞状态的线程会抛出一个异常,并且将线程的中断状态清除掉,这样就可以让线程退出阻塞状态了。
			3)Thread.sleep()、Thread.join()、object.wait()等方法的实现中,都包含了对线程中断标识的检测:如果发现中断标志为true则抛出异常并且将中断标志位设置为false。
			
		isInterrupted():
			public boolean isInterrupted()
			说明:测试线程是否已经中断,不清除线程的中断状态。
			eg:thread.isInterrupted();   // 判断thread指向的线程对象是否为中断状态。
		
		interrupted():
			public static boolean interrupted()
			说明:测试当前线程是否已经中断,并将线程的中断标识设为false。
			eg:thread.interrupted();   // 判断调用thread.interrupted();语句的线程(即当前线程)是否为中断状态。
				
		
	7)stop():
		@Deprecated
		public final void stop()
		说明:终止线程,马上让线程停止运行,并释放该线程所持有的锁!导致数据得不到同步的处理,可能出现数据不一致的问题。
		
		补充:其它停止线程的方法;
			1>手动抛出异常来停止线程(推荐):
				优点:在catch块中可以将捕获的异常向上抛出,使得线程停止的事件可以向上传播。

			2>使用return停止线程:
				使用interrupt()方法与return结合起来,实现停止线程的功能。
				eg:在run方法中:if (this.isInterrupt()) {return;}

		
	8)suspend():
		@Deprecated
		public final void suspend()
		说明:
			1>挂起线程,使线程进入“阻塞”状态,在调用resume()方法前该线程一直处于阻塞状态。
			2>独占公共的同步对象,使得其它线程无法访问公共的同步对象。
			3>该方法容易发生死锁:调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁。如果其它线程想通过resume()方法来恢复目标线程,若在恢复目标线程的时候必须使用目标线程锁定的资源,就会造成死锁。
		举例:当一个线程的run()方法中的程序执行并进入到一个synchronized方法的内部时,如果此时该线程调用suspend()方法被挂起了,那么直到调用resume()方法被唤醒之前,这个synchronized方法将一直处于“暂停”状态,并且“锁未被释放”,其它线程就不能调用这个方法了。
		
		
	9)resume():
		@Deprecated
		public final void resume()
		说明:恢复线程,恢复被suspend方法挂起的线程
		注意:suspend()与resume()容易导致死锁,故应该使用锁对象调用wait()和notify()的机制来代替suspend()和resume()来控制线程。


	10)getName()/setName():
		说明:获取/设置线程的名称
		注意:第一个子线程默认的名字:Thread-0	





	


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值