0%

多线程——线程状态

方法 说明
setPriority(int newPriority) 更改线程的优先级
static void sleep(long millis) 在指定的毫秒数内让当前正在执行的线程休眠
void join() 等待该线程终止
static void yield() 暂停当前正在执行的线程对象,并执行其他线程
void interrupt() 中断线程,别用这个方式
boolean isAlive() 测试线程是否处于活动状态

停止线程

  • 不推荐使用JDK提供的stop(), destroy()方法
  • 推荐线程自己停止
  • 建议使用标志位flag,flag=false时,终止线程运行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class TestThread03 implements Runnable{
private boolean flag = false;
@Override
public void run(){
//run方法线程体
while(!flag){
System.out.println("我在看片");
}
}
public void stop(){
this.flag = true;
System.out.println("不看了");
}
public static void main(String[] args){
//创建runnable接口的实现类对象
TestThread03 testThread3 = new TestThread03();

//创建线程对象,通过线程对象来开启我们的线程,代理
new Thread(testThread3).start();
for (int i = 0; i < 200; i++) {
if(i == 100) testThread3.stop();
System.out.println("我在学习" + i);
}
}
}

线程休眠

  • sleep(时间)指定当前线程阻塞的毫秒数
  • sleep存在异常InterruptedException
  • sleep时间达到后线程进入就绪状态
  • sleep可以模拟网络延时,倒计时等
  • 每一个对象都有一个锁,sleep不会释放锁
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.sympa.lesson01;

//模拟网络延时:放大问题的发生性
public class Tickets01 implements Runnable{

private int ticket = 10;
@Override
public void run() {
while(true) {
if (ticket <= 0) break;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
//Thread.currentThread() 获得当前线程对象的引用
System.out.println(Thread.currentThread().getName() + "拿到了第" + ticket-- + "张票");
}
}

public static void main(String[] args){
Tickets01 tickets01 = new Tickets01();
new Thread(tickets01, "黄牛1号").start();
new Thread(tickets01, "黄牛2号").start();
new Thread(tickets01, "黄牛3号").start();
}
}

线程礼让

  • 礼让线程,让当前正在执行的线程暂停,但不阻塞
  • 让线程由运行状态转为就绪状态
  • 让CPU重新调度,礼让不一定成功,看CPU心情

线程强制执行Join

  • Join合并线程,待此线程执行完成后,再执行其它线程,其它线程阻塞
  • 可以想象成插队

观测线程状态

Thread.State

线程状态,线程可以处于以下状态之一:

  • NEW:尚未启动的线程处于此状态
  • RUNNABLE:在Java虚拟机中执行的线程处于此状态
  • BLOCKED:被阻塞等待监视器锁定的线程处于此状态
  • WAITING:正在等待另一个线程执行特定动作的线程处于此状态
  • TIMED_WAITING:正在等待另一个线程执行动作达到指定等待时间的线程处于此状态
  • TERMINATED:已退出的线程处于此状态

一个线程可以在给定时间点处于一个状态,这些状态是不反映任何操作系统线程状态的虚拟机状态

线程优先级

  • Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有课程,线程调度器按照优先级决定应该调度哪个线程来执行
  • 线程的优先级用数字表示,范围从1~10
    • Thread.MIN_PRIORITY = 1;
    • Thread.MAX_PRIORITY = 10;
    • Thread.NORM_PRIORITY = 5;
  • 使用getPriority().setPriority(int xxx)来改变或获取优先级
  • 优先级的设定建议在start()调度前
  • 优先级低只是意味着获得调度的概率低,并不是优先级低就不会被调用,都是看CPU的调度(性能倒置)

守护(daemon)线程

  • 线程分为用户线程和守护线程
  • 虚拟机必须确保用户线程执行完毕
  • 虚拟机不用等待守护线程执行完毕
  • 如,后台记录操作日志,监控内存,垃圾回收等
1
2
3
Thread thread = new Thread();
thread.setDaemon(true); //默认是false代表用户线程,正常线程都是用户线程
thread.start(); //守护线程启动
------ THEEND ------

欢迎关注我的其它发布渠道