解析java线程中的常用方法

解析java线程中的常用方法

1 获取当前线程对象的引用

1.1 内容

public static Thread currentThread();

1.2 使用分析

它是一个静态方法,可以通过类名.调用

无需传入任何实参

返回值为Thread对象(线程对象)

通常和线程对象.getName方法配合使用,用来得到当前方法里面运行的是哪个线程

1.3 示例代码

Cat类
package Work4;
public class Cat implements Runnable{
    @Override
    public void run() {
        int count=0;
        while(count<10){
            System.out.println("线程名"+Thread.currentThread().getName()+"的小猫咪正在喵喵喵"+(++count));
        }
    }
}

ThreadTest类
package Work4;

public class ThreadTest {
    public static void main(String[] args) {
       //main线程的名字就是main,静态方法也可以通过类名.调用,本质还是类名.静态方法名
        System.out.println("main线程的名字为: "+Thread.currentThread().getName());
        Thread t=new Thread(new Cat());
        System.out.println("使用对象名.静态方法的结果为: "+t.currentThread().getName());
    }
}

1.4 示例代码运行截图

在这里插入图片描述

2 获取线程的名字

2.1 内容

public final String getName()

2.2 使用分析

被final修饰,意味着该方法不能被重写

无需传入任何实参

返回值为String类型,谁调用,返回谁的名字

2.3 示例代码

Cat类
package Work4;
public class Cat implements Runnable{
    @Override
    public void run() {
        int count=0;
        while(count<10){
            System.out.println("线程名"+Thread.currentThread().getName()+"的小猫咪正在喵喵喵"+(++count));
        }
    }
}

ThreadTest类
package Work4;
public class ThreadTest {
    public static void main(String[] args) {
        Thread t=new Thread(new Cat());
        //获取自定义的线程的名字,若没有修改,默认是按照Thread-序号的方式进行命名,序号从0开始
        System.out.println(t.getName());
    }
}

2.4 示例代码运行截图

在这里插入图片描述

3 设置线程的名字

3.1 内容

public final void String setName(String name)

3.2 使用分析

被final修饰,意味着该方法不能被重写

需要传入自定义的线程名字

返回值为void,谁调用,就是谁的名字被更改

3.3 示例代码

Cat类
package Work4;
public class Cat implements Runnable{
    @Override
    public void run() {
        int count=0;
        while(count<10){
            System.out.println("线程名"+Thread.currentThread().getName()+"的小猫咪正在喵喵喵"+(++count));
        }
    }
}

ThreadTest类
package Work4;
public class ThreadTest {
    public static void main(String[] args) {
        //创建一个线程,这个状态是NEW的状态
        Thread t=new Thread(new Cat());
        //自定义线程的名字
        t.setName("catA线程");
        System.out.println(t.getName());
    }
}

3.4 示例代码运行截图

在这里插入图片描述

4 获取线程的当前状态

4.1 内容

public Thread.State getState()

4.2 使用分析

无需传入实参

返回值类型为Thread.State

可以用来监视系统的状态

4.3 示例代码

Cat类
package Work4;
public class Cat implements Runnable{
    @Override
    public void run() {
        int count=0;
        while(count<10){
            System.out.println("线程名"+Thread.currentThread().getName()+"的小猫咪正在喵喵喵"+(++count));
        }
    }
}

ThreadTest类
package Work4;
public class ThreadTest {
    public static void main(String[] args) {
        Thread t=new Thread(new Cat());
        //创建后,线程的状态应该是NEW的状态
        System.out.println("创建但未运行时线程的状态为: "+t.getState());
        t.start();
        //启动start方法后,线程的状态应该是Runnale(可运行)状态
        System.out.println("启动start方法后,线程的状态为: "+t.getState());
    }
}

4.4 示例代码运行截图

在这里插入图片描述

5 使当前线程睡眠(进入TimedWaiting状态)

5.1 内容

public static void sleep(long millis)

5.2 使用分析

被static修饰,因此可以通过类名.sleep的方式调用

返回值类型为void

形参为long类型,实参传入整数类型即可,int类型的字面量也行,因为会发生自动类型转换

形参单位是毫秒,其中1秒=1000毫秒;

谁调用,谁睡眠,睡眠时间由传入的实参时间决定

5.3 示例代码

Cat类
package Work4;
public class Cat implements Runnable{
    @Override
    public void run() {
        int count=0;
        while(count<10){
            System.out.println("线程名"+Thread.currentThread().getName()+"的小猫咪正在喵喵喵"+(++count));
        }
    }
}

ThreadTest类
package Work4;
public class ThreadTest {
    public static void main(String[] args) {
        Thread t=new Thread(new Cat());
        t.start();
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("main线程睡眠5s后再打印这句话!!!!");
    }
}

5.4 示例代码运行截图

在这里插入图片描述

6 当一个线程睡眠时间很长,我们想让它醒来

6.1 内容

public void interrupt()

6.2 使用分析

6.2.1 内容

返回值类型为void
形参无,因此无需传入实参
谁调用就终止谁的线程

6.2.2 实际使用

终止正在睡眠的线程(TimedWaiting状态),实际上就是返回线程开启睡眠的所在行,抛出一个异常,然后进入catch里面,catch里面写一些醒来后的逻辑.

6.2.3 使用场景

某个线程需要运行但是不急着运行,因为cpu的时间片等资源有限,我们就会先让该线程睡眠比较长的时间,然后当cpu不这么忙的时候,我们就把该线程唤醒它,让它去执行它里面对应的逻辑

6.3 示例代码

Cat类
package Work4;
public class Cat implements Runnable{
    @Override
    public void run() {
        int count=0;
        try {
              Thread.sleep(1000*60*60*24);
        } catch (InterruptedException e) {
            System.out.println("唤醒线程: "+Thread.currentThread().getName());
            System.out.println("线程名"+Thread.currentThread().getName()+"的小猫咪正在喵喵喵"+(++count));
        }
    }
}

ThreadTest类
package Work4;
public class ThreadTest {
    public static void main(String[] args) {
        Thread t=new Thread(new Cat());
        t.start();
        for (int i = 0; i <10; i++) {
            System.out.println("主线程在运行: "+Thread.currentThread().getName()+(i));
        }
        t.interrupt();
    }
}

6.4 示例代码运行截图

在这里插入图片描述

7 经典面试题

7.1 题目

阅读以下代码,思考t.sleep(1000)是让哪个线程睡眠5秒

Cat类

package Work4;
public class Cat implements Runnable{
    @Override
    public void run() {
        System.out.println(Thread.currentThread().getName()+"线程在运行");
    }
}

ThreadTest类

package Work4;
public class ThreadTest {
    public static void main(String[] args) {
        Thread t=new Thread(new Cat());
        t.start();
        try {
            t.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("main线程执行结束");
    }
}

7.2 分析

对象名.静态方法名本质还是通过类名.静态方法名的方式去进行调用

而Thread.sleep(1000)的作用是让当前线程(在哪个方法里面就是哪个的线程)睡眠

因此t.sleep(1000)让main线程睡眠了1秒

因此会先执行完t对应的线程里面的逻辑,再执行main线程睡眠后面的逻辑

7.3 题目的运行结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SSS4362

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值