Java多线程编程--(1)线程的基本概念
一.线程的五种状态:
新建(new):新建(new) 用new语句创建的线程对处于新建状态,此时它和其它Java对象一样,仅仅在Heap中被分配了内存。当一个线程处于新建状态时它仅仅是一个空的线程对象,系统不为它分配资源。 Thread t = new Thread(new Runner());
就绪(Runnable):程序通过线程对象调用启动方法start()后,系统会为这个线程分配它运行时所需的除处理器之外的所有系统资源。这时,它处在随时可以运行的状态,在随后的任意时刻,只要它获得处理器即会进入运行状态。
,此时线程就进入了运行状态,开始运行run函数当中的代码。
阻塞(Blocked):线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。
死亡(Dead):如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪状态。
二. 用户线程和守护线程:
守护线程与普通线程的唯一区别是:当JVM中所有的线程都是守护线程的时候,JVM就可以退出了;如果还有一个或以上的非守护线程则不会退出。(以上是针对正常退出,调用System.exit则必定会退出)
三. Thread.setDaemon()用法使用
1. setDaemon需要在start方法调用之前使用
2. 如果jvm中都是守护进程,当前jvm将exit。(包括守护线程)
package com.nemo.thread; public class DaemonTest extends Thread{ public static void main(String[] args) { Thread t1 = new UserThread(); Thread t2 = new Thread(new MyDaemonThread()); t1.start(); t2.setDaemon(true); t2.start(); } public static class UserThread extends Thread{ public void run(){ for(int i=0;i<5;i++){ try { Thread.sleep(7); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("用户线程运行"+i); } } } public static class MyDaemonThread implements Runnable{ public void run() { for(int i=0;i<1000;i++){ try { Thread.sleep(7); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("守护线程运行"+i); } } } }
运行结果:
用户线程运行0
守护线程运行0
用户线程运行1
守护线程运行1
用户线程运行2
守护线程运行2
用户线程运行3
守护线程运行3
用户线程运行4
守护线程运行4
说明:用户线程线程是保证执行完毕的,守护线程还没有执行完毕就退出了。
浙公网安备 33010602011771号