多线程的意义:提高程序的使用率,cpu的利用率
实现线程的几种方式
继承thread类
重写run方法
通过start调用启动
- 建一个类,继承thread类,重写run方法。
- 在另一个类里把刚才那个类new出来,调用对象的start方法
- 这是一个线程 多个线程的话要new多个对象出来 同时调用start方法
实现runnable接口
重写run
把该类作为参数传到thread里
通过start调用
- 建一个类,实现runnable接口,重写run方法
- 在另一个类里把刚才的类new出来,再new一个thread类出来,将刚才的对象放在thread对象内
- 要开多个线程的话就new多个thread对象
- 通过thread对象的start方法来运行线程
开发中一般用第二种:
避免java单继承的局限性
适合多个相同程序代码处理同一个资源的情况
线程的命名
通过setname方法来设置名字
(继承thread类)在类中写一个构造方法,传一个string对象(名字)进去,构造方法内用super调用
thread类的有参构造
(实现runnable接口)在newthread的时候,将对象和线程的名字两个都传进去。
run和start的区别
run:仅仅封装被线程执行的代码,直接调用的话相当于普通方法
start:首先启动一个线程,通过jvm调用run方法
优先级 setpriority()
优先级越高,抢到的概率越高,并不是高的一定能抢到
1~10的整数,默认是5
放在start之前
休眠 sleep()
加入线程 join() 会把当前线程执行完 再执行其他线程
**线程礼让 yeild() **让当前运行状态的线程释放自己的cpu资源,从运行状态变为就绪状态,然后重新和其他线程抢资源 礼让不一定成功 当线程转为就绪状态时,抢到cpu,从中断位置继续执行
守护线程(后台线程) setdaemon(true)
当所有非守护线程死亡后守护线程也会死亡,由于设备延迟,守护线程会运行一小段再死亡
中断线程
stop()太暴力 不建议使用
interrupt() 只能改变当前线程的状态为中断(true),并不能中断一个正在运行的线程,在这个基础上进入阻塞状态(sleep,wait,join),就会抛出interruptedexception,中断状态被清除,重新设置为false,线程退出。 无论是先中断还是先阻塞都能达到停止线程的目的。
this.interrupted()方法 测试当前线程是否中断(静态),会返回上一次的中断状态,并且会清除该状态,连续调用两次,第一次返回true,第二次返回false。
this.isinterrupted()方法 测试当前线程是否中断,但是不会清除当前状态。