• 细说多线程之Thread VS Runnable


    【线程创建的两种方式】

    【线程的生命周期】


    ● 就绪:创建了线程对象后,调用了线程的start()。
    (注意:此时线程只是进入了线程队列,等待获取CPU服务,具备了运行的条件,但并不一定已经开始运行了)。
    ● 运行:处于就绪状态的线程,一旦获取了CPU资源,便进入到运行状态,开始执行run()里面的逻辑。
    ● 终止:线程的run()执行完毕,或者线程调用了stop(),线程便进入终止状态。
    ● 阻塞:一个正在执行的线程在某些情况下,由于某种原因而暂时让出了CPU资源,暂停了自己的执行,
    便进入了阻塞状态,如调用了sleep()等。

    【Java线程有两类】
    用户线程:运行在前台,执行具体任务。程序的主线程、连接网络的子线程等都是用户线程。

    守护线程:运行在后台,为其他前台线程服务。
    特点:一旦所有用户线程都结束运行,守护线程会随JVM一起结束工作。
    应用:数据库连接池中的检测线程;JVM虚拟机启动后的检测程线程。
    最常见的守护线程:垃圾回收线程。

    如何设置守护线程:
    可以通过调用Thread类的setDaemon(true)来设置当前的线程为守护线程。

    注意事项
    ● setDaemon(true)必须在start()之前调用,否则会抛出IllegalThreadStateException异常。
    ● 在守护线程中产生的新线程也是守护线程。
    ● 不是所有的任务都可以分配给守护线程来执行,比如读写操作或者计算逻辑(中间中断等,这种情况守护线程也就没必要存在了)。

    【守护线程代码实例】

     1 import java.io.File;
     2 import java.io.FileOutputStream;
     3 import java.io.OutputStream;
     4 import java.util.Scanner;
     5 
     7 public class DaemonThreadDemo {
     8     
     9     public static void main(String[] args) {
    10         System.out.println("进入主线程:" + Thread.currentThread().getName());
    11         
    12         DaemonThread daemonThread = new DaemonThread();
    13         Thread thread = new Thread(daemonThread);
    14         thread.setDaemon(true);
    15         thread.start();
    16         
    17         // 从键盘接收输入,
    18         Scanner sc = new Scanner(System.in);
    19         sc.next();  // 主线程就会阻塞住了
    20         // 一旦我们执行了输入操作,阻塞就会解除掉。主线程会继续执行。然后打印下面一行数据。
    21         
    22         System.out.println("退出主线程:" + Thread.currentThread().getName());
    23     }
    24 }
    25 
    26 class DaemonThread implements Runnable {
    27 
    28     @Override
    29     public void run() {
    30         // TODO Auto-generated method stub
    31         System.out.println("进入守护线程:" + Thread.currentThread().getName());
    32         try {
    33             writeToFile();
    34         } catch (Exception e) {
    35             e.printStackTrace();
    36         }
    37         System.out.println("退出守护线程:" + Thread.currentThread().getName());
    38     }
    39     
    40     private void writeToFile() throws Exception {
    41         File filename = new File("b:" + File.separator + "daemon.txt");
    42         OutputStream os = new FileOutputStream(filename, true);
    43         int count = 0;
    44         while(count < 999) {
    45             os.write(("
    word" + count).getBytes());
    46             System.out.println("守护线程" + Thread.currentThread().getName()
    47                     + "向文件中写入word" + count++);
    48             Thread.sleep(1000);
    49         }
    50     }
    51     
    52 }


    【使用jstack生成线程快照】
    作用:生成JVM当前时刻线程的快照(thraddump,即当前进程中所有线程的信息)。

    目的:帮助定位程序问题出现的原因,如长时间停顿、CPU占用率过高等。

    目录:X:jdkin

  • 相关阅读:
    Kafka Eagle安装
    CentOS下OpenJDK设置JAVA_HOME
    设计模式:解释器模式
    Typora主题推荐
    SpringMVC的<mvc:annotation-driven />
    SpringMVC的视图解析器
    数字化营销
    《计算广告》第二版思维导图
    舆情计算
    实时数仓
  • 原文地址:https://www.cnblogs.com/androidsj/p/5069787.html
Copyright © 2020-2023  润新知