zoukankan      html  css  js  c++  java
  • Thread线程类

    设置线程名

    查看线程名是很简单的,调用Thread.currentThread().getName()即可。

    public class MyThreadDemo {
        public static void main(String[] args) {
    
    
            MyThread myThread = new MyThread();
    
            //带参构造方法给线程起名字
            Thread thread1 = new Thread(myThread, "关注公众号Java3y");
            Thread thread2 = new Thread(myThread, "qq群:742919422");
    
    
            thread1.start();
            thread2.start();
            
            // 打印当前线程的名字
            System.out.println(Thread.currentThread().getName());
        }
    }

    守护线程

    守护线程是为其他线程服务的

    • 垃圾回收线程就是守护线程~

    守护线程有一个特点

    • 当别的用户线程执行完了,虚拟机就会退出,守护线程也就会被停止掉了。
    • 也就是说:守护线程作为一个服务线程,没有服务对象就没有必要继续运行

    使用线程的时候要注意的地方

    1. 在线程启动前设置为守护线程,方法是setDaemon(boolean on)
    2. 使用守护线程不要访问共享资源(数据库、文件等),因为它可能会在任何时候就挂掉了。
    3. 守护线程中产生的新线程也是守护线程

    优先级线程

    线程优先级高仅仅表示线程获取的CPU时间片的几率高,但这不是一个确定的因素

    线程的优先级是高度依赖于操作系统的,Windows和Linux就有所区别(Linux下优先级可能就被忽略了)~

    可以看到的是,Java提供的优先级默认是5,最低是1,最高是10:

    线程生命周期

    线程有3个基本状态:执行、就绪、阻塞

    Thread上很多的方法都是用来切换线程的状态的,

    sleep方法(thread类中的静态方法,Thread.sleep()调用后,所在的线程进入等待

    调用sleep方法会进入计时等待状态,等时间到了,进入的是就绪状态而并非是运行状态!(注意sleep方法不会释放锁

    yield方法(thread类中的静态方法,调用后所在当前线程让出cpu的控制权

    调用yield方法会先让别的线程执行,但是不确保真正让出

    意思是:我有空,可以的话,让你们先执行

    join方法(是final方法,线程1对象.final(),则线程1具有优先性,它先执行完,才执行别的线程

    调用join方法,会等待该线程执行完毕后才执行别的线程~

    interrupt方法

    线程中断在之前的版本有stop方法,但是被设置过时了。现在已经没有强制线程终止的方法了!

    由于stop方法可以让一个线程A终止掉另一个线程B

    • 被终止的线程B会立即释放锁,这可能会让对象处于不一致的状态
    • 线程A也不知道线程B什么时候能够被终止掉,万一线程B还处理运行计算阶段,线程A调用stop方法将线程B终止,那就很无辜了~

    总而言之,Stop方法太暴力了,不安全,所以被设置过时了。

    我们一般使用的是interrupt来请求终止线程~

    • 要注意的是:interrupt不会真正停止一个线程,它仅仅是给这个线程发了一个信号告诉它,它应该要结束了(明白这一点非常重要!)
    • 也就是说:Java设计者实际上是想线程自己来终止,通过上面的信号,就可以判断处理什么业务了。
    • 具体到底中断还是继续运行,应该由被通知的线程自己处理
    • Thread t1 = new Thread( new Runnable(){
          public void run(){
              // 若未发生中断,就正常执行任务
              while(!Thread.currentThread.isInterrupted()){
                  // 正常任务代码……
              }
              // 中断的处理代码……
              doSomething();
          }
      } ).start();
      

      再次说明:调用interrupt()并不是要真正终止掉当前线程,仅仅是设置了一个中断标志。这个中断标志可以给我们用来判断什么时候该干什么活!什么时候中断由我们自己来决定,这样就可以安全地终止线程了!

    • interrupt线程中断还有另外两个方法(检查该线程是否被中断)[检查中断是使用interrupt的用途之一]

      • 静态方法interrupted()-->会清除中断标志位
      • 实例方法isInterrupted()-->不会清除中断标志位
      • 【用途二:用在阻塞线程,或者将要进入阻塞的线程,设置中断状态(即使用interrupt())时,抛出interruptException,中断状态复位,同时该线程会退出阻塞的】
  • 相关阅读:
    Python性能鸡汤
    postgreSQL设置自增长字段并插入值
    DBSCAN算法的Java,C++,Python实现
    查看进程及端口使用情况
    软件工程中的各种图
    程序员技术练级攻略[转]
    CSS中 opacity的设置影响了index(层数)的改变
    页面预加载loading动画
    JS 判断用户使用的设备类型
    图片懒加载——介绍
  • 原文地址:https://www.cnblogs.com/serendipity-fly/p/9359043.html
Copyright © 2011-2022 走看看