控制线程的方法有join(),sleep()(休眠)、yield()(让步)、suspend()(挂起){容易造成死锁,不建议使用}、resume()(恢复{同样容易造成死锁,不建议使用});
简单的测试下sleep()和yield(),并说明线程在这两种状态下对cpu的持有状态和对同步锁的持有状态:
在这里不贴出程序运行的结果,大家可以根据代码在自己的机器上跑一下体会一下我接下来要阐述的,这要看起来比我直接贴出图要效果更好。
在没有添加同步锁synchornized(this){}的时候,线程若处于休眠状态,会将cpu让出,让其他处于就绪状态的线程来执行,yield()也是一样,但是yield会比比较一下线程之间的优先级,只有比自己优先级高或者相等的的才有可能获得cpu的执行权
sleep不会进行比较。
线程若是加上了同步锁,则在这两种状态下是不会释放掉同步锁的,也就是因为同步锁的原因即使线程此时让出了cpu的使用权,其他的线程由于得不到同步锁而导致线程阻塞无法运行。所以虽然会让出cpu但是其他的线程却会因为同步锁的原因而备阻塞住。
join(){伪代码如下}:
主线程/其他线程1{
//当程序运行到这一步的时候主线程/其他线程1会停止运行而等待
//其它线程2,让它来运行程序,可以传一个参数表示主线程/其它线程1
//最多可以等待的时间
其它线程2.join();
}