目录
线程的五大生命周期:新建状态,就绪状态,运行状态,堵塞状态,死亡状态
线程的五大生命周期:新建状态,就绪状态,运行状态,堵塞状态,死亡状态
线程的七大状态:
- Thread.State枚举表示了线程的几种状态
- NEW
- 尚未启动的线程处于此状态
- RUNNABLE
- 这可以细分为两个状态:
- Ready:准备就绪
- Running:运行中
- 在Java虚拟机中执行的线程处于此状态
- 这可以细分为两个状态:
- BLOCKED
- 被堵塞等待监视器锁定的线程处于此状态
- WAITING
- 正在等待另一个线程执行特定动作的线程处于此状态
- TIMED_WAITING
- 正在等待另一个线程执行动作达到指定等待时间得到线程处于此状态
- TERMINATED
- 以退出的线程处于此状态
线程的常用方法:
- void start(); //使该线程开始执行,JVM底层调用该线程的 start0() 方法
- void run(); //调用线程对象的run方法 就是一个简单的方法调用,不会启动新线程
- Thread currentThread(); //获取当前线程对象
- String getName(); //获取线程对象的名字
- void setName(); //修改线程对象的名字
- 当线程没有设置名字的时候,默认的名字有什么规律?
- Thread-0
- Thread-1
- Thread-2……
- void setPriority(); //更改线程的优先级
- int getPriority(); //获取线程的优先级
- static void sleep(); //指定毫秒数,让当前线程进行休眠
- void interrupt(); //中断线程的睡眠(这种中断睡眠的方式依靠了java的异常处理机制) 叫醒服务
- void stop(); //强行终止线程,不建议使用,容易丢失数据。
- void yield(); //线程的礼让,让出CPU,让其他线程执行,但礼让的事件不确定,所以也不一定礼让成功。
- void join(); // 线程的插队,插队的线程一旦插队成功,则肯定先执行完插入的线程所有的任务
- 关于线程的sleep方法:
- static void sleep(long millis)
- 1、静态方法:Thread.sleep(1000);
- 2、参数是毫秒
- 3、作用:
- 让当前线程进入休眠,就是进入堵塞状态,放弃占有CPU时间片,让给其他线程使用。
- 这行代码出现在A线程中,A线程就会进入休眠。
- 这行代码出现在B线程中,B线程就会进入休眠。
常见的线程调度模型有哪些?
- 抢占式调度模型:
- 哪个线程的优先级比较高,抢到的CPU时间片的概率就高一些/多一些。
- java采用的就是抢占式调度模型。
- 均分式调度模型:
- 平均分配CPU时间片。每个线程占有的CPU时间片时间长度一样。
- 平均分配,一切平等。
- 有一些编程语言,线程调度模型采用的是这种方式。
java中提供了哪些方法是和线程调度有关系的呢?
- 实例方法:
- void setPriority(int newPriority); //设置线程的优先级
- int getPriority(); //获取线程优先级
- 最低优先级是1
- 默认优先级是5
- 最高优先级是10
- 优先级比较高的获取CPU时间片可能会多一些。
- 静态方法:
- static void yield(); //让位方法
- 暂停当前正在执行的线程对象,并执行其他线程
- yield()方法不是堵塞方法。让当前线程让位,让给其他线程使用。
- yield()方法的执行会让当前线程从运行状态回到就绪状态。
- 实例方法:
- void join(); //线程插队
- t.join(); //t合并到当前线程中,当前线程受堵塞,t线程执行结束才会执行当前线程。
java语言中线程分成两大类:
1、用户线程 : 也叫工作线程,当线程的任务执行完或通知方式结束
2、守护线程(后台线程)
主线程main方法是一个用户线程。
其中具有代表性的就是:垃圾回收线程(守护线程)
线程对象.setDaemon(true); //将线程设置为守护线程,需要在启动start之前
守护线程用在什么地方呢?
每天00:00的时候系统数据自动备份。
这个需要使用到定时器,并且我们可以将定时器设置为守护线程。
一直在哪里看着,每到00:00的时候就备份一次。
所有得到用户线程如果结束了,守护线程自动退出,没有必要进行数据备份了。
注意:
即使是死循环,但由于该线程是守护者,当用户线程结束,守护线程自动终止。
定时器的作用:
间隔特定的时间,执行特定的程序。
例如:
每周要进行银行账户的总账操作。
每天要进行数据的备份操作。
- 在实际的开发中,每隔多久执行一段特定的程序,这种需求是很常见的,那么在java中其实可以采用多种方式实现:
- 1、可以使用sleep方法,睡眠,设置睡眠时间,每到这个时间点醒来,执行任务。这种方式是最原始的定时器。(比较low)
- 2、在Java的类库中已经写好了一个定时器:java.util.Timer,可以直接拿来用。不过这种方式在目前的开发中也很少用,因为现在有很多高级框架都是支持定时任务的。
- 3、在实际的开发中,目前使用较多的是Spring框架中提供的SpringTask框架,这个框架只要进行简单的配置,就可以完成定时器的任务。