(2)Java多线程Thread提供的方法

1.引言

      在本片博客中主要记录一下Thread提供的几种方法,利用该方法我们可以实现一些我们的需求。

  • currentThread()方法:注意这是静态方法,用于获得当前线程对象
  • interrupted()方法:注意这是静态方法,用于判断当前线程是否中断
  • sleep()方法:注意这是静态方法,让当前线程对象处于休眠状态
  • yield()方法:注意这是静态方法, 暂停当前正在执行的线程对象,并执行其他线程。
  • getName()方法:非静态的,可以帮助我们调试线程
  • isAlive()方法:非静态的,测试线程是否处于活动状态。
  • interrupt()方法:非静态的,中断线程。
    *isInterrupted()方法:注意这是非静态的。

上面介绍了7中方法,其中有四种静态方法,有三种非晶态方法。静态方法是和当前线程绑定的静态方法是和当前线程绑定的静态方法是和当前线程绑定的,重要的话说三遍,非静态方法是和实例对象绑定的。

2.Java线程提供的方法

2.1 解释静态方法是和当前线程绑定

  • 代码

public class MyThread extends Thread{
    @Override
    public void run() {
        System.out.println("多线程技术");
    }

}

public class app {
    public static void main(String[] args) throws InterruptedException {
        //创建一个线程实例
        Thread td=new MyThread();
        //启动线程
        td.start();
        //让线程睡5秒
        td.sleep(5000);
        System.out.println("main主线程");
    }

}
  • 代码解释

        我们本来的意愿:让我们自定义的线程睡5秒,但是上面的代码是错误的(大家可以去实验一下),
        因为我们在main线程中调用的sleep()方法,因为sleep方法是静态的,是和当前线程绑定的。
        所以执行此方法,并不是让,Mythread线程睡5秒,而是让main线程睡了5秒钟。
    

2.2 利用interrupt()方法控制线程停止。

在开发的过程中,在一些需求会有这样的代码:

while(true)
{
    //代码
}

这是一个死循环,如果该死循环放在了多线程当中,我们如何去控制改循环的停止呢?此时我们借助于interrupted()实现线程的停止,需要注意的是,调用interrupt()方法调用之后并不会直接停止线程。需要结合一些判断才能停止我们的线程。(注意这不是一个方法,一个用于判断线程是否中断,一个是用来中断线程)步骤可以总结为两步:

第一步:
    主线程中调用interrupt()中止线程
第二步:
    自定义线程通过interrupted()方法跳出死循环,可以通过break,也可以通过return,也可以通过抛异常

break:跳出循环,
return:跳出方法
剖异常:跳出方法
  • 我们自定义的线程

public class MyThread extends Thread{
    @Override
    public void run() {
        int i=0;
        while(true){
            //当调用interrupt()方法之后,this.isInterrupted()的返回值为true
            if(this.isInterrupted()){
                System.out.println("线程被停止了");
                return;//这里也可以是break;或者可以throw new InterruptedException();
            }
            System.out.println(i++);

        }   
    }

}

  • main方法中的代码

public class app {
    public static void main(String[] args) throws InterruptedException {
        //创建一个线程实例
        Thread td=new MyThread();
        //启动线程
        td.start();     
        Thread.sleep(2000);     
        td.interrupt();
        System.out.println("我要停止线程");
    }

}
  • 运行结果

这里写图片描述

2.3 使用yield() 可以让线程释放资源

  • 代码如下

public class MyThread extends Thread{
    @Override
    public void run() {

        long begin=System.currentTimeMillis();

        for(int i=0;i<1000000;i++)
        {
            Thread.yield();
        }
        long end=System.currentTimeMillis();
        System.out.print(end-begin);



    }

}
  • main函数

public class app {
    public static void main(String[] args) throws InterruptedException {
        //创建一个线程实例
        Thread td=new MyThread();
        //启动线程
        td.start();     


    }

}

*运行结果

这里写图片描述

  • 假设将Thread.yield()方法注释掉,运行结果

这里写图片描述

  • 代码解释

        我们使用Thread.yield()方法可以使该线程释放CPU资源,此方法并不需要我们自己唤醒线程。是可以自动唤醒自己的。
    

2.4补充

1.使用Stop方法也可以停止线程(不推荐,已经过时了)
2.使用suspend和resume可以暂停线程,启动线程(不推荐,已经过时了,并且存在着线程安全的问题。以后在说这个问题)

3.总结

      在本博客中主要记录了:

  • 如何停止线程
  • 如何沉睡线程
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值