Thread源码-start及stop方法

环境:jdk1.8


start方法源码如下:

/**
 * 同步方法:启动线程
 */
public synchronized void start()
{
	//判断线程状态是否处于"NEW",0表示"NEW",如果不是则抛出异常
	if (threadStatus != 0)
		throw new IllegalThreadStateException();

	//添加到线程组中
	group.add(this);

	//定义临时变量用于记录线程启动状态
	boolean started = false;
	try
	{
		//调用本地方法,启动物理线程
		start0();
		//线程启动成功
		started = true;
	} 
	finally
	{
		try
		{
			if (!started)
			{
				//线程启动失败,则将失败线程从线程组中清掉
				group.threadStartFailed(this);
			}
		} 
		catch (Throwable ignore)
		{
			/*
			 * do nothing. If start0 threw a Throwable then it will be passed up the call
			 * stack
			 */
			//不做处理,当调用本地start0方法时,抛出Throwable异常,则会自动跳出调用栈
		}
	}
}
线程启动:
1.start方法被sychronized修饰,是同步方法,即同一时刻只能有一个线程可以进入方法
2.start方法中判断了线程状态,如果不是"NEW"状态,则抛出IllegalThreadStateException运行时异常,所以多次调度该方法,会出现该异常
3.线程的启动实际是由本地方法start0控制,底层启动物理线程,并且底层抛出任何异常,该方法也不会做任何处理
4.调用start正常启动起一个线程后,线程获取到cpu时间片,jvm会回调Thread的run方法

stop方法源码如下:
/**
 * 非同步方法:停止线程,使用@Deprecated进行修饰,说明该方法已被废弃
 */
@Deprecated
public final void stop()
{
    SecurityManager security = System.getSecurityManager();
    //权限检查:是否拥有停止线程的权限
    if (security != null) 
    {
        checkAccess();
        if (this != Thread.currentThread()) 
        {
            security.checkPermission(SecurityConstants.STOP_THREAD_PERMISSION);
        }
    }

    if (threadStatus != 0) 
    {
    	//恢复暂停的线程
        resume(); 
    }

    // The VM can handle all thread states
    //交由虚拟机处理线程死亡状态
    stop0(new ThreadDeath());
}
线程停止:
1.stop方法目前已被废弃,原因是:stop会强制停止正在执行的线程,这可能会极大破坏数据的完整性,对象状态也可能难于预测,线程处于不安全状态

以一个例子来证明执行stop可能导致线程不安全:
代码如下:
public static void main(String[] args)
{
	Thread t = new Thread(new Runnable()
	{
		@Override
		public void run()
		{
			System.out.println("休息前..");
			//休息五秒
			try
			{
				TimeUnit.SECONDS.sleep(5);
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
			System.out.println("休息后..");
		}
	});
	
	t.start();
	try
	{
		TimeUnit.SECONDS.sleep(1);
	} 
	catch (InterruptedException e)
	{
		e.printStackTrace();
	}
	
	t.stop();
}
打印如下:
休息前..
由上可见:
调用stop方法,可能导致线程中某些逻辑无法执行到,达不到预期结果



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值