1 线程终止
🆔 简要说明:
当线程完成任务后,会自动退出;
还可以通过 使用变量来控制run方法退出的方式停止线程,即通知方式。
🦁 案例演示:
启动一个线程t,要求在main线程中去停止线程t,请通过编程实现。
/** * @author 兴趣使然黄小黄 * @version 1.0 */ public class ThreadExit01 { public static void main(String[] args) { T t = new T(); t.start(); //如果希望main线程去控制t线程的终止,则需要修改loop //让t退出run方法,从而终止t线程,即通知方式 //先让主线程休眠5秒,再退出 try { Thread.sleep(5 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } t.setLoop(false); } } class T extends Thread{ /** * 控制变量 */ private boolean loop = true; @Override public void run() { while (loop){ System.out.println("T 运行中......"); try { Thread.sleep(50); } catch (InterruptedException e) { e.printStackTrace(); } } } public void setLoop(boolean loop) { this.loop = loop; } }
2 线程常用方法
2.1 常用方法一览表
方法名 | 说明 |
setName | 设置线程名称,使之与参数 name 相同 |
getName | 返回该线程的名称 |
start | 使该线程开始执行,Java虚拟机底层调用该线程的start0方法 |
run | 调用线程对象 run 方法 |
setPriority | 更改线程的优先级 |
getPriority | 获取线程的优先级 |
sleep | 在指定的毫秒数内让当前正在执行的线程休眠(暂停执行) |
interrupt | 中断线程(与终止不同),没有真正的结束线程,一般用于中断正在休眠的线程 |
yield | 线程的礼让。让出cpu,让其他的线程执行,但礼让时间不确定,所以不一定礼让成功 |
join | 线程的插队。线程的插队一旦插入成功,则肯定先执行插入的线程所有的任务 |
2.2 方法注意事项
start 底层会创建新的线程,调用 run。而直接调用 run,就是一个简单的方法调用,不会启动新的线程;
线程优先级范围:最低优先级为1,正常为5,最高为10;
interrupt,中断线程,但是并没有真正的结束线程,一般用于中断正在休眠的线程;
sleep,线程的静态方法,使当前线程休眠。
3 线程中断
线程的中断通过interrupt方法实现。 在该案例中,创建一个线程Cat,该线程run方法会不停的打印“喵喵喵~”。在主线程中,我们记录主线程打印“hello”的次数,当打印5次时,则中断cat线程的休眠。
🐱 示例代码及结果:
/** * @author 兴趣使然黄小黄 * @version 1.0 * 线程中断案例演示 */ public class ThreadTest { public static void main(String[] args) throws InterruptedException{ Cat cat = new Cat(); cat.start(); // 主线程打印5次 hello,中断子线程的休眠 for (int i = 0; i < 5; i++) { Thread.sleep(1000); System.out.println("hello" + ", 第" + (i+1) + "次"); } //当执行到这里,就会中断cat线程的休眠 cat.interrupt(); } } class Cat extends Thread{ @Override public void run() {// 自定义线程类 while (true){ for (int i = 0; i < 100; i++) { System.out.println(Thread.currentThread().getName() + ": 喵喵喵~~~" + ", 第" + (i+1) + "次"); } try { //休眠20秒 System.out.println(Thread.currentThread().getName() + "正在sleep"); Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); //当线程执行到一个interrupt方法时,就会catch一个异常 System.out.println(Thread.currentThread().getName() + "被interrupt"); } } } }
🐰 说明:
上述案例,每次进行cat线程时,都会打印100次喵喵喵,然后进入20秒的休眠。但是主线程中,每进行5次打印hello后,就会对cat线程进行中断,此时cat线程的休眠中断,继续执行打印100次喵喵喵的操作。
4 线程插队
线程插队主要通过 join 来实现。 要求如下:
1.创建一个子线程,每隔1s输出hello,输出10次,主线程每隔1s,输出hi,输出10次;
2.两个线程同时执行,当主线程输出5次后,就让子线程运行完毕,主线程继续。
🐱 示例代码及结果:
/** * @author 兴趣使然黄小黄 * @version 1.0 * 线程插队 */ public class ThreadJoinTest { public static void main(String[] args) throws InterruptedException{ Thread thread = new Thread(new SonTread()); thread.start(); for (int i = 0; i < 10; i++) { System.out.println("hi" + (i+1)); Thread.sleep(1000); if(i == 4){ thread.join(); } } } } class SonTread implements Runnable{ int count = 0; @Override public void run() { while (count < 10){ System.out.println("hello" + (++count)); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
🐰 说明:
上述案例中,主线程和子线程一同工作,当主线程的hi打印完毕第五个时,主线程中断,让子线程先继续打印完毕10个hello,而后主线程继续完成之前的工作。