环境: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方法,可能导致线程中某些逻辑无法执行到,达不到预期结果