💁 个人主页:黄小黄的博客主页
❤️ 支持我:👍 点赞 🌷 收藏 🤘关注
🎏 格言:All miracles start from sometime somewhere, make it right now.
本文来自专栏:JavaSE从入门到精通
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,而后主线程继续完成之前的工作。
写在最后
🌟以上便是本文的全部内容啦,后续内容将会持续免费更新,如果文章对你有所帮助,麻烦动动小手点个赞 + 关注,非常感谢 ❤️ ❤️ ❤️ !
如果有问题,欢迎私信或者评论区!
共勉:“你间歇性的努力和蒙混过日子,都是对之前努力的清零。”