----------- android培训、java培训、java学习型技术博客、期待与您交流! ------------
Thread类中的几个常用方法和字段:
static int MAX_PRIORITY 线程可以具有的最高优先级(10级)。
static int MIN_PRIORITY 线程可以具有的最低优先级(1级)。
static int NORM_PRIORITY 分配给线程的默认优先级(5级)。
void setPriority(int newPriority) 更改线程的优先级(就是更改线程的执行频率但不会停止线程)。
String getName() 返回该线程的名称。
void setDaemon(boolean on) 将该线程标记为后台线程(不标记为前台线程,前台线程都结束后,后台线程会自动结束,此时jvm退出)。
String toString() 返回该线程的字符串表示形式,包括线程名称、优先级和线程组。
static void yield() 暂停当前正在执行的线程对象,并执行其他线程(作用是不至于某个线程的执行频率过高)。
实现多线程的方法:
1.继承Thread类
1.定义类继承Thread类
2.复写Thready类中的run方法(此方法类似于main方法,类似于是线程的入口)
目的:将自定义代码储存在run方法中,让线程运行
3.调用线程的start方法(这种方式才是真正去使用一个线程,调用run方法的话相当于普通方法调用)
这个方法有两个作用:1.启动线程,2.调用run方法
2.实现Runnable接口
相比较而言,实现Runable方法要比直接继承Thread类要好,因为这样可以避免继承带来的单根性问题
1.定义类实现Runnable接口
2.覆盖Runnable接口中的run方法
目的:将自定义代码储存在run方法中,让线程运行
3.通过Thread类建立线程对象(即创建上述类的对象,当成Thread类的构造函数的参数(就是下一步的操作)即可)
4.将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数
因为run方法所属的对象时Runnable接口的子类对象,所以要让线程去运行指定对象的run方法,就必须要明确该run方法所属的对象
5.调用Thread类额start方法开启线程并调用Runnable接种子类的run方法
线程的运行状态:
1.被创建
2.运行start()
3.冻结 睡眠sleep() 等待wait()
4.唤醒notify()
5.消亡stop()
多线程的安全性:
当run方法中有多条执行语句时,多条线程可能带来的问题:一个线程执行了一句语句,剩下的还没执行,
由于cpu的切换就可能导致其他线程进来执行,同样的其他线程也可能暂时被停止,这样就会带来安全隐患。
解决方法:
使操作共享数据的多条语句(单条语句的话不会引起安全问题)同步即可
因为进入被同步修饰的代码块的线程会被锁定,执行完操作之后才能被释放,这样就能实现多线程的安全性,但是性能会下降
多块代码都被同步(都操作同一个共享数据)时,多个synchroized需用同一个锁
实现方式:
1.使用synchroized()
{
需要被同步的代码块
}
2.使用同步synchroized关键字修饰需要被同步的函数即可,synchroized关键字的位置位于返回值之前
普通synchroized方法中的锁是this,即当前对象的引用
静态synchroized方法中的锁是类名.class
死锁:
同步内部嵌套同步,但是用的不是同一个锁,就会造成死锁
线程间的通讯:
对同一资源同时进行类似于”进和出“的操作,此时为了保证安全性,要对进和出都进行同步,可以用操作的那个唯一的资源充当锁来保证锁的唯一性
等待唤醒:
等待 wait();和唤醒notify()、notifyall()都在同步中,因为这些操作的前提是其必须拥有锁
强制唤醒:
void interrupt() 强制唤醒线程。但会抛出异常InterruptedException
加入线程:
join()当A线程执行到了B线程的.join()方法时,A就会等待。等B县城都执行完之后A才会继续执行,多用于临时独占CPU