2020-12-25
Thread的常用方法
构造方法:
Thread() 创建一个线程对象new Thread
Thread(Runnable target)创建一个线程对象并将线程的任务类作为参数传递
Thread(String name)创建线程并指定名称
Thread(Runnable target,String name) 创建一个线程对象,将任务对象传递,并且指定名称
获取线程的名称
getName()
获取名称的方式:如果不设置线程的名称,线程有一个默认的名称Thread-X,X就表示这个线程的编号
1、拿到线程的引用获取线程的名称;
2、继承线程类时,在run方法的内部获取线程名称
3、实现任务接口,在run方法的内部获取线程名称(这种方式获取不到线程的引用就无法获取线程的信息,Thread.currentThread().getName()
设置线程的名称
setName(); Thread(String name); Thread(Runnable target,String name);
获取线程对象
currentThread()获取当前正在执行代码的线程对象
说明:无论是什么样的代码,无论代码在哪里,只有代码在执行,正在有线程执行这段代码,所以只要有代码执行,我们就可以在执行代码中获取当前的线程对象
既然可以获取线程对象,那么就可以获取任意的线程对象:Thread.currentThread().getName()
静态方法直接可用类名调用,而不是对象名
线程休眠
Thread sleep(long time)
可以调用sleep()方法来休眠一个线程
线程休眠:就是让这个线程等待指定的时间之后再去执行
InterruptedException:线程休眠过程中可能出现休眠的中断,导致睡眠不足。
处理改异常的方案:
1、主方法可直接抛出
2、在run方法中只能对异常做出处理try...catch,不能抛出
守护线程
含义:守护线程不能够独立存在,专门用于给非守护线程提供一个良好运行环境而存在。
说明:当程序中所有非守护线程都执行完毕,如果程序中只剩下守护线程那么程序就结束了。
设置守护线程的方法:
setDaemon(boolean n)当这个参数的值为true时,就可以设置守护线程
Boolean isDaemon()判断是否是守护线程
线程的优先级
说明:线程的运行过程中资源是随机分配的,哪个线程抢到资源就先运行;如果我们希望在抢夺资源的过程中让一个线程可以有更大机会执行就可以设置线程的优先级。
setPriority(int newPriority)
设置线程的优先级,优先级的传值1-10
getPriority()获取线程的优先级
MAX_PRIORITY 10
MIN_PRIORITY 1
NORM_PRIORITY 5
总结:即使给了线程优先级最大的差别,但是差距不会太大
线程的安全隐患
问题的演示:
1、服务端1000
2、客户端1 1000+100
1100
客户端2 1000+100
1100
问题的描述:当一个线程正在执行任务,另外一个线程也开始执行相同的任务,并且拿到的数据是第一个正在执行任务的线程返回给他的数据。
问题的根本原因:就是一个线程在操作过程中,又出现一个线程执行相同的任务
同步代码块
synchronized 关键字是同步代码块的标识
格式:synchronized(同步锁){
需要保护的任务;
}
能够处理线程安全的原因:
就是在一个相同的同步锁下,线程再去执行代码时,都要先获取这个锁对象。如果获取不到就不能执行代码块中的内容。当线程都拥有一致的锁之后,一个线程获取到之后另外一个就无法获取
在同步代码块中的锁对象上可以传递一个this表示相同锁
详细的机制:
1、不同的代码拥有相同的锁对象
2、当线程去获取锁对象时,这个线程就可以执行代码
3、如果线程执行完毕就可以把锁对象给释放
4、释放之后再去争抢锁对象
5、如果不释放锁对象,那么其他线程只能等待
同步方法:
就是整个方法中的功能都需要被保护,这时就可以使用同步方法;例如:英雄OL如果不使用同步可能会导致的情况
格式 修饰 synchronized 返回值类型 方法名(参数列表){
整个被保护的代码;
}
同步方法的锁对象就是当前调用的这个方法的引用,也就是this
静态同步方法
1、public static synchronized void print1()
2、synchronized (StaticPrint.class)
静态的方法不能使用this作为锁对象,可以获取类的this信息作为锁对象
类名.class作为静态同步方法的锁对象即可
回归线程安全的类型
1、线程安全的类型
1、StringBuffered 2、Hashtable 3、vector 线程安全的单列集合
2、线程不安全的类型
1、StringBuiler 2、HashMap 3、ArrayList
线程的状态
1、说明:线程的状态是指线程在某个阶段处于的状态
2、线程状态的罗列:
①新建态 将线程创建之后的状态
②就绪态 一切数据准备就绪,等待CPU来执行
③运行态 抢占到CPU的时间片可以执行
④阻塞态 因为某种原因导致线程阻塞 io wait sleep或者时资源没有准备好
⑤死亡态 线程结束来到死亡态
Java中线程状态的方法和描述
1、说明 线程状态的分类只是一个书面的分类 并不代表一定可以获取到某种线程状态。
比如java中的就绪态就无法获取。
2、获取线程状态的方法
Thread.state getstate()
作用:就是获取java线程的状态
返回值:
Thread.state state是Thread中的内部类 表示线程状态的类型。
Thread.state枚举类型的介绍
枚举:罗列 穷举
说明:有些类型中所要表示的数据是确定的这时就可以使用枚举类型。直接可将所要描述的数据都是一些静态类型的常量。这些常量就被称之为枚举项。
Thread.state这个类型中给我们提供了六个枚举项。
罗列:
NEW java中的新建态
RUNNABLE java中的运行态
BLOCKED 阻塞态中的一种 原因等待获取锁对象
WAITING 原因就是该线程调用了wait方法进入阻塞态
TIMED_WAITING 阻塞态的一种 受到时间限制来到阻塞态 sleep wait
TERMINATED 线程的死亡态