1、static void sleep(long millis):
- 静态方法 ,参数是毫秒 ,
作用:让当前线程进入休眠,进入“阻塞状态”,放弃占有CPU时间片,让给其它线程使用。 * - Thread.sleep()方法 可以做到的效果:间隔特定的时间,去执行一段特定的代码,每隔特定的时间执行一次。
//让当前线程进入休眠,睡眠5s
/*try {
Thread.sleep(1000*5);//让
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("hello world");
*/
for (int i = 0; i < 10; i++) {
//此段代码实现的效果就是,每输出一次,隔1S后再输出,直至循环结束
System.out.println(Thread.currentThread().getName()+"---->"+i);
try {//当前线程进入“阻塞状态”,睡眠1s
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
sleep()方法分面试题:
//在主线程中调用分支线程的sleep()方法,可以使分支线程休眠,进入阻塞状态吗?
public class ThreadTest7 {
public static void main(String[] args) {
//创建线程对象
Thread mt3 = new MyThread3();
//设置线程名
mt3.setName("mt3");
//启动线程
mt3.start();
//问题答案:
//调用sleep()
//mt3.sleep(时间参数);此句代码运行时会转换成 Thread.sleep(时间参数);
// 这句代码是错误的,因为sleep()方法只能用在线程中,
// 即要想让mt3休眠,sleep()方法必须放在MyThread3中的run()方法内,才是有效的。
}
}
class MyThread3 extends Thread{
@Override
public void run() {
for (int i = 0; i < 10000; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"---->"+ i);
}
}
}
重点,怎样终止sleep()方法:
/*
* sleep()睡眠太久了,如果希望 半道上醒来,该怎么办?也就是怎么终止线程的休眠?
* */
public class ThreadTest8 {
public static void main(String[] args) {
Thread t = new Thread(new MyRunnable2());
t.setName("t");
t.start();
//希望5s后,t线程醒来
try {
Thread.sleep(1000*5);//睡眠5s
System.out.println("t线程执行");
} catch (InterruptedException e) {
e.printStackTrace();
}
//中断t线程的睡眠,这种终端睡眠的方式依靠了java的异常处理机制
t.interrupt();
//进行干扰, 使t线程中的Thread.sleep()方法出异常,进入catch部分,打印异常信息,
// 结束后,整个try..catch部分结束,t线程正常往下运行。
}
}
class MyRunnable2 implements Runnable{
//重点:run()方法中的异常不能throws,只能try..catch
// 因为run()方法在父类中没有抛出任何异常,子类不能比父类抛出更多的异常。
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"-----> begin");
try {//这里只能try..catch,因为子类不能比父类抛出更多或者更宽泛的异常。
Thread.sleep(1000*60*60*24*365);
} catch (InterruptedException e) {
// e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"-----> end");
}
}
怎样强行终止一个线程:
/*
* 怎么合理的终止线程的执行:
* 合理使用if...else 和 return 语句
* */
public class ThreadTest10 {
public static void main(String[] args) {
MyRunnable4 r = new MyRunnable4();
Thread t = new Thread(r);
t.setName("t");
t.start();
//模拟5s
try {
Thread.sleep(1000*5);
} catch (InterruptedException e) {
e.printStackTrace();
}
//终止线程,修改属性run的值,让其直接跳转else,执行return即可。
r.run = false;
}
}
class MyRunnable4 implements Runnable{
//布尔标记
boolean run = true;
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if (run) {//run没有问题,再继续往下运行
System.out.println(Thread.currentThread().getName()+"----->"+i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
//想保存数据之类的操作,可以在return之前执行,
// 因为return语句的执行才是真正的终止线程
//终止线程
return;
}
}
}
}