/**
* 1、关于线程的sleep方法:
* static void sleep(long millis)
* 参数是毫秒
* 作用:让当前进程进入休眠,进入“阻塞状态”,放弃占有的CPU时间片,让给其他线程使用
*
* 2、Thread.sleep()方法,可以间隔特定的时间,去执行一段代码,每隔多久执行一次
*
*/
public class ThreadTest04 {
public static void main(String[] args) {
/* for (int i = 0; i < 10; i++) {
System.out.println("输出后,睡眠一秒 :" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}*/
Thread mm = new Mm();
mm.setName("mm");
mm.start();
try {
mm.sleep(5000);
//不要看这里是mm.sleep就会休眠mm线程
//在执行的时候,还是会转换为Thread.sleep()方法的,让当前进程,也就是main进程进入休眠
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("我被休眠了,现在才好");
}
}
class Mm extends Thread{
@Override
public void run() {
for (int i = 0; i <10 ; i++) {
System.out.println(Thread.currentThread().getName() +" -->" + i);
}
}
}
/*
* sleep睡眠太久,怎么唤醒一个正在睡眠的线程?
* 注意:这个中断不是线程的中断,而是线程睡眠的中断
* */
public class ThreadTest05 {
public static void main(String[] args) {
Thread aa = new My01();
System.out.println("主线程测试开始");
aa.start();
//5秒之后,分支线程起来,因为主线程里的活干完了(其实是主线程也睡了5秒钟)
try {
aa.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//中断线程的睡眠,(这种中断睡眠的方法依靠的是java的异常处理机制)
//注意:这里只有aa.start()所以,默认的是终止的是分支线程
aa.interrupt();
System.out.println("测试结束");
//说明一下,这里为什么输出语句,不是在最后输出的,而是和最后两句同时输出的,这是因为线程并发执行的,
//aa.interrupt();
/*测试开始
开始执行,下面准备睡眠很长时间
测试结束
没睡好,就被叫起来干活
开始干活*/
//如果没有的话,是不是终止的是主线程呢
// 经过测试,是不行的,主线程不能被终止,这和java自然而下执行的亘古不变原则,有冲突
/*try {
Thread.sleep(1000 * 5);
} catch (InterruptedException e) {
e.printStackTrace();
}
Thread.interrupted();*/
}
}
class My01 extends Thread{
/**
* 这个run方法的有异常只能catch,不能往外抛出,
* 因为父类Thread中的run,就没有往外抛,子类不能比父类抛出更多的异常
* public void run() {
* if (target != null) {
* target.run();
*/
@Override
public void run() {
System.out.println("分支线程开始执行,下面准备睡眠很长时间");
try {
Thread.sleep(1000 * 60 * 60 * 24);
} catch (InterruptedException e) {
//e.printStackTrace();
System.out.println("没睡好,就被叫起来干活");
}
System.out.println("开始干活");
}
}
/**
* java中怎么强行终止一个线程的执行?
* stop方式有很大的缺点,容易丢失数据,因为这种方式将线程直接杀死了
* 线程没有保存的数据会丢失,不建议使用
*/
public class ThreadTest06 {
public static void main(String[] args) {
Thread tt = new My06();
tt.start();
try {
tt.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//已过时,不建议使用,强行终止进程(直接把线程给干死了)
tt.stop();
}
}
class My06 extends Thread{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + "---->" + i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
/**
* 怎么合理的终止一个线程的执行,这种方式是很常用的
*/
public class ThreadTest07 {
public static void main(String[] args) {
My066 aa = new My066();
aa.setName("aa");
aa.start();
//主线程睡眠5秒后,终止分支线程
try {
aa.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
aa.run01 = false;
}
}
class My066 extends Thread{
//打一个布尔标记
boolean run01 = true;
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if(run01){
try {
System.out.println(Thread.currentThread().getName() + "-->" + i);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else {
//这里可以save。。。。。
return;
}
}
}
}