1.Thread.sleep方法
public static native void sleep(long millis) throws InterruptedException;
1.sleep是一个静态的本地方法
2.参数是毫秒long millis
3.让当前线程进入休眠,进入“阻塞”状态,放弃占有CPU时间片,让给其他线程使用。
也就是说:暂停当前线程,把cpu片段让出给其他线程,减缓当前线程的执行。
2.用sleep模拟按秒计时
package com.thread.threadsleep;
import java.text.SimpleDateFormat;
import java.util.Date;
//模拟倒计时
public class TestSleep2 {
public static void main(String[] args) {
//打印当前系统时间
Date startTime = new Date(System.currentTimeMillis());//获取当前时间
while (true){
try {
Thread.sleep(1000);
System.out.println(new SimpleDateFormat("HH:mm:ss").format(startTime));
startTime = new Date(System.currentTimeMillis());//更新时间
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void tenDown() throws InterruptedException {
int num =10;
while (true){
Thread.sleep(1000);
System.out.println(num--);
if (num<=0){
break;
}
}
}
}
3.用sleep方法模拟龟兔赛跑
//模拟龟兔赛跑
public class Race implements Runnable {
private static String winnner;
@Override
public void run() {
for (int i = 1; i <=100; i++) {
//模拟兔子休息
if (Thread.currentThread().getName().equals("兔子") && i%10==0){
try {
Thread.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//判断比赛是否结束
boolean flag = gameOver(i);
if (flag){
break;
}
System.out.println(Thread.currentThread().getName()+"跑了"+i+"步");
}
}
//判断是否完成比赛
private boolean gameOver(int step){
if (winnner != null){//已经有胜利者了
return true;
}else if (step >= 100){
winnner = Thread.currentThread().getName();
System.out.println("Winner is "+winnner);
return true;
}
return false;
}
public static void main(String[] args) {
Race race =new Race();
new Thread(race,"兔子").start();
new Thread(race,"乌龟").start();
}
}
这里应用一个标志位 boolean flag = gameOver(i);判断比赛是否结束,来终止线程。终止线程不能用stop方法****种方式是直接将线程杀死了。
线程没有保存的数据将会丢失。
注意:
一般睡眠可以用
TimeUnit.
注意事项参考https://blog.csdn.net/feigeswjtu/article/details/78700101
- sleep是帮助其他线程获得运行机会的最好方法,但是如果当前线程获取到的有锁,sleep不会让出锁。
- 线程睡眠到期自动苏醒,并返回到可运行状态(就绪),不是运行状态。
- 优先线程的调用,现在苏醒之后,并不会里面执行,所以sleep()中指定的时间是线程不会运行的最短时间,sleep方法不能作为精确的时间控制。
- sleep()是静态方法,只能控制当前正在运行的线程。