【线程创建的两种方式】
【线程的生命周期】
● 就绪:创建了线程对象后,调用了线程的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(("\r\nword" + 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:\jdk\bin
时间: 2024-10-09 20:57:01