1.实现线程的两种方式
继承Thread类
实现Runnable接口
在源码总其实Thread 是继承Runnable接口的
启动线程调用的是线程的start方法,并不是run方法
如果调用run方法,只是和普通的方法调用时一样的并没有启动一个线程
另外start方法 调用 不代表线程的执行顺序,只是表明线程处于就绪状态随时都可以执行
两种方式的对比
使用继承 没有实现灵活。继承是有局限性的。在java中是单继承的,不支持多继承。但实现是可以多实现的
线程安全 和非线程安全
什么是线程安全呢?
简单来说就是线程在执行后,按照了你想让他执行结果输出。
那么非线程安全就是没有按照了你想要的方式输出。
比如在线程中有一个变量 i=5
这个run方法呢 就执行 i--;
但是假如其他人也调用了这个线程,但你的i--还没有执行完了。 那么这个线程执行的结果就不是你想要的了
Thread中的一个常用方法
Thrad.currentThread();方法返回当前的线程
isAlive(); 判断线程是否处于活跃状态, 而这个活跃状态表示的是线程从启动到终止
注意事项 在run方法内部判断线程是否处于活跃状态的时候用Thread.currentThread().isAlive();不要用this.isAlive();判断
sleep();方法 休眠毫秒数
停止线程 如何使用interrupt停止一个线程
大多数停止线程使用的是Thread.interrupt()方法 ,尽管是停止和终止的意思但这个方法却不会停止一个正在运行的进程,还需要加入一个判断才能停止。调用interrupt()方法相当于是在线程中打了一个停止的标记
interrupt() 中断线程
static interrupted() 测试当前线程是否中断 当前线程是指运行这个方法的线程
连着两此调用 因为第一次调用已经清楚状态的功能所以第二次调用就不一定是true
isInterrupted() 判断是不是中断状态
可以使用 if-break 或者是try-catch的方式停止一个线程 使用return停止线程
暂停线程 suspend
恢复线程 resume
这两个方法回造成线程独占对象,而且这两个方法不同步
yield() 放弃对cpu的占用,让给其他任务,但是放弃的时间不确定,有可能刚刚放弃就会继续占用cpu
线程的优先级
线程优先级具有继承性,A线程调用了B线程,那么B线程的优先级是和A相同的
不一定优先级高的线程 就一定会先执行完
而且不一定优先级高的线程就一定会先执行
但是优先级高的线程运行的相对较快