写点什么

线程的生命周期及线程相关常用的方法

作者:几分醉意.
  • 2022-11-23
    安徽
  • 本文字数:2744 字

    阅读完需:约 9 分钟

线程的生命周期

关于线程对象的生命周期新建状态就绪状态运行状态阻塞状态死亡状态这个要记住,面试可能会问。


线程对象的方法


代码演示


public class 线程对象的方法 {    public static void main(String[] args) {        //currentThread:获取当前线程对象        //thread就是当前线程对象        //这个代码出现在main方法中,所以当前线程就是主线程        Thread thread = Thread.currentThread();  // 静态方法        System.out.println(thread.getName());//main
//创建线程对象 MyThread2 t1 = new MyThread2(); //getName:获取线程名字 String a = t1.getName(); System.out.println(a);//Thread-0 默认的 //setName:修改线程名字 t1.setName("t1"); System.out.println(t1.getName()); //t1
MyThread2 t2 = new MyThread2(); t2.setName("t2");
t2.start(); t1.start(); }}class MyThread2 extends Thread{ @Override public void run() { for (int i = 0; i < 100; i++) { //thread就是当前线程对象。那么当前线程是谁呢? //当t1线程执行run方法,那么这个当前线程就是t1 //当t2线程执行run方法,那么这个当前线程就是t2。 类似于this 谁调用我 我就是谁 Thread thread = Thread.currentThread(); System.out.println(thread.getName()+"-->"+i); } }}
复制代码


执行结果


Sleep 方法


举例


public class sleep方法 {    public static void main(String[] args) {
//让当前线程进入休眠 失眠五秒 //这个代码出现在main方法中,当前线程就是主线程!! try { Thread.sleep(1000*5); } catch (InterruptedException e) { e.printStackTrace(); }
//5秒之后执行这里的代码 System.out.println("hello world!");
for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName()+"--->"+i); //休眠一秒 //这个方法还是出现在主线程中,所以主线程受阻 try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } }}
复制代码

Sleep 面试题


public class sleep方法面试题 { public static void main(String[] args) { //创建线程对象 Thread t = new MyThread3(); t.setName("t"); t.start();
//调用sleep方法 try { //问题:这行代码会让线程t进入休眠状态吗? t.sleep(1000*5); //在执行的时候还是会转成Thread.sleep(1000*5); //这行代码的作用是:让当前线程进入休眠。也就是说main'线程进入休眠 //这样代码出现在main方法,main线程睡眠 //5秒后就如就绪状态 抢到执行权 执行hello world } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("hello World!");
}
}class MyThread3 extends Thread{ @Override public void run() {
for (int i = 0; i < 10000; i++) { System.out.println(Thread.currentThread().getName()+"-->"+i); } }}
复制代码

终止线程的睡眠

sleep 睡眠太久了,如果希望半道上醒来,你应该怎么办呢?也就是说怎么叫醒一个正在睡眠的线程??注意:这个不是终断线程的执行,是终断线程的睡眠。


/*sleep睡眠太久 如果希望半道醒来,就要终止睡眠 */public class 终止线程的睡眠 {    public static void main(String[] args) {        Thread t = new Thread(new MyRunnable2());        t.setName("t");        t.start();
//希望五秒之后,t线程醒来(五秒之后主线程手里的话干完了,不用争执行权了) try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } //终止t线程的睡眠( 这种终端睡眠的方法依靠java的异常处理机制) t.interrupt();//干扰 一盆冷水过去 }}class MyRunnable2 implements Runnable{
// 重点: run()当中的异常不能throws,只能try catch // 因为run()方法在父类中没有抛出任何异常,子类不能比父类抛出更多的异常。 @Override public void run() { System.out.println(Thread.currentThread().getName()+"--->"+"big"); try { //睡眠一年 Thread.sleep(1000L *60*60*24*365); } catch (InterruptedException e) { //打印异常信息 e.printStackTrace(); } //一年之后才会执行到这里 System.out.println(Thread.currentThread().getName()+"--->"+"end"); }}
复制代码

终止一个线程的执行

public class 终止一个线程的执行 {    public static void main(String[] args) {        MyRunable4 r = new MyRunable4();        Thread t = new Thread(r);        t.setName("t");        t.start();        //模拟5秒        try {            Thread.sleep(5000);        } catch (InterruptedException e) {            e.printStackTrace();        }
//终止线程 //你想要什么时候终止t的执行,那么把标记修改为false,就结束了 r.run =false; }}class MyRunable4 implements Runnable{ //打一个布尔标记 boolean run = true;
@Override public void run() { for (int i = 0; i < 10; i++) { if (run){ System.out.println(Thread.currentThread().getName()+"-->"+i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }else { //return就结束了 //结束前可以保存呀 //save...
//终止当前线程 return; } } }}
复制代码


发布于: 刚刚阅读数: 5
用户头像

几分醉意.

关注

还未添加个人签名 2022-10-22 加入

还未添加个人简介

评论

发布
暂无评论
线程的生命周期及线程相关常用的方法_Java_几分醉意._InfoQ写作社区