zoukankan      html  css  js  c++  java
  • 学习多线程——必会的的9个方法

    乱入:

    定义一个线程可以继承Thread类,也可以实现Runnable接口,但是都需要重写run()方法,在run方法中的异常只能使用try...catch来进行捕获而不能是throw上抛异常。因为重写的run方法没有抛异常。

    废话不多说,这篇文章里面主要介绍的是学习多线程的过程中必会的几个方法,在这里做个讲解,巩固一下知识点;

    一、concurrentThread()——获取当前运行的线程对象

    Thread.concurrentThread()方法可以获取到当前运行的线程。我们在运行代码的时候,同一段代码可能会被多个线程执行,我们使用Thread.concurrentThread()的时候,返回给我们的就是目前实际正在运行的线程对象。

    二、setName()/getName()——设置/获取线程名称

    thread.setName()方法:设置线程名称

    thread.getName()方法:获取线程名称

    我们在执行线程的时候,为了方便区别不同的线程,可以使用thread.setName()方法为线程设置一个名称,使用thread.getName()方法可以获取我们为线程设置的名称。

    三、isAlive()——判断线程存活状态

    thread.isAlive()方法用于判断当前运行的线程是否是已启动并且尚未终止。

    四、sleep()方法——线程睡眠

    Thread.sleep(millis)方法,让当前运行的线程对象休眠指定的毫秒数

    五、getId()——获取线程唯一标识id

    每条线程都有自己的唯一标识符id,使用Thread.currentThread().getId()方法可以返回当前线程的唯一标识符Id,当此线程执行结束之后,其唯一标识符id可能会被分配给其他的线程使用。

    六、yeild()——放弃CPU资源

    每个线程的执行都必须先获取到CPU的执行权,而Thread.yeild()方法的作用是让当前的线程放弃cpu的资源(也叫线程让步)。

    七、setPriority()——设置线程优先级

    thread.setPriority(num)设置线程的优先级,线程的优先级范围为1到10,执行的优先级依次增高。如果超出此范围,会抛出异常IllegaArgumentException()。优先级越高的线程,获取CPU资源也就会越多。线程优先级本质上只是给线程调度器一个提示信息,以便于线程调度器先调用哪些线程。但是:不能保证优先级越高的线程会被优先执行

    线程饥饿:线程的优先级设置不当可能会使得某些线程永远无法被执行,也叫做线程饥饿。

    线程的优先级并不是越高越好,一般情况下我们使用默认的线程优先级就可以了。默认的线程优先级是5

    线程的优先级具有继承性,假如你在A线程中创建了B线程,那么A线程就是父线程,B线程就是子线程,子线程的优先级会与父线程的优先级保持一致。

    八、interrupt()——打中断标记

    thread.interrupt()方法用于为线程打上停止标记,并不是真正的直接中断线程。如果我们想直接中断线程,可以使用this.isinterrupted()方法判断当前的线程是否被打上了中断标记,如果该方法返回true,则可以使用return方法直接中断当前的方法体的执行。

    写一个测试:

    public class Thread1 extends  Thread{
        @Override
        public void run() {
            for (int i = 0; i < 10; i++) {
                if(this.isInterrupted()){
                    System.out.println("线程被打上中断标记");
                    return;
                }
                System.out.println(this.getName()+"执行==》"+i);
            }
    
        }
    }
    
    
    public class ThreadTest {
        public static void main (String[] args){
            Thread1 thread1 = new Thread1();
            thread1.start();
            for (int i = 0; i < 10; i++) {
                System.out.println("线程执行===》"+i);
            }
    //        thread1.interrupt(); //不打中断标记,thread1线程能够正常执行,打上此标记,thread1线程
    //                              通过this.isinterrupted()方法进行判断,从而对方法体执行中止。
        }
    }

    九、setDaemon()——设置守护线程

    线程可以分为守护线程和用户线程。

    守护线程:守护线程是专门为其他线程服务的线程。我们常说的垃圾回收器(GC)就是一个典型的守护线程。

                    守护线程在JVM中不能单独运行,如果没有其他的用户线程运行的时候,守护线程就会自动销毁,然后JVM退出。

    thread.setDaemon(true)方法可以设置thread线程为守护线程
    
  • 相关阅读:
    使用 suspend 和 resume 暂停和恢复线程
    在 Go 语言中使用 Session(一)
    理解Cookie和Session
    Go Iris 中间件
    Go 通道(channel)与协程间通信
    Java终止线程的三种方式
    Go http包执行流程
    Java项目服务器跨域设置
    mysql5.7初始化密码报错 ERROR 1820 (HY000): You must reset your password using ALTER USER statement before
    记录下在阿里云linux上安装与配置Mysql
  • 原文地址:https://www.cnblogs.com/wgty/p/12810492.html
Copyright © 2011-2022 走看看