JavaThead
1、常用方法
1.1 创建新建线程并启动
//法一:
class PrimeThread extends Thread {
//构造函数
PrimeThread() {
}
//run方法一定要重写
public void run() {
}
}
//启动
PrimeThread p = new PrimeThread();
p.start();
//法二:是先实现runnable接口,在作为target传入Thead运行
class PrimeRun implements Runnable {
...
}
//启动
PrimeRun p = new PrimeRun();
new Thread(p).start(); //p作为参数传入Thead运行
1.2 方法
1、构造函数
Thread()
//分配一个新的 Thread对象。
Thread(String name)
//分配一个新的 Thread对象
Thread(ThreadGroup group, Runnable target, String name)
//分配一个新的 Thread对象,使其具有 target作为其运行对象,具有指定的 name作为其名称,属于 group引用的线程组。
2、线程方法
getId()
返回此线程的标识符。
getName()
返回此线程的名称。
getState()
返回此线程的状态。
setPriority(int newPriority)
更改此线程的优先级。
sleep(long millis)
使当前正在执行的线程以指定的毫秒数暂停,当前线程进入TIMED_WAITING状态,millis后线程自动苏醒进入就绪状态。
yield()
对调度程序的一个暗示,即当前线程愿意让出当前使用的处理器,调度程序重新选择运行的线程。
join()
让线程进入等待
1.3 线程状态
-
线程状态。线程可以处于以下状态之一:
-
NEW
新建了线程对象但尚未启动处于此状态。 即还没有调用start()方法。 -
RUNNABLE
在Java虚拟机中执行的线程处于此状态。Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。
线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。
就绪状态的线程在获得CPU时间片后变为运行中状态(running)。 -
BLOCKED
表示线程阻塞于锁。等待获取锁的状态 -
WAITING
进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
当前线程调用其他线程的 thread.join() 方法时,当前线程进入该状态
处于这种状态的线程不会被分配CPU执行时间,它们要等待被显式地唤醒,否则会处于无限期等待的状态。 -
TIMED_WAITING
正在等待另一个线程执行动作达到指定等待时间的线程处于此状态。
超时等待状态,该状态不同于WAITING,它可以在指定的时间后自行返回。
当前线程调用其他线程的 thread.join(long millis) 方法时,当前线程进入该状态
当前线程主动调用 sleep(long millis) 方法也进入此种状态
处于这种状态的线程不会被分配CPU执行时间,不过无须无限期等待被其他线程显示地唤醒,在达到一定时间后它们会自动唤醒。 -
TERMINATED
已退出的线程处于此状态
线程状态图:
1.4 锁有关
1、thread.join()/thread.join(long millis),当前线程里调用其它线程t的join方法,当前线程进入WAITING/TIMED_WAITING状态,当前线程不会释放已经持有的对象锁。线程t执行完毕或者millis时间到,当前线程一般情况下进入RUNNABLE状态,也有可能进入BLOCKED状态(因为join是基于wait实现的)。
join方法的原理就是调用相应线程的wait方法进行等待操作的,例如A线程中调用了B线程的join方法,则相当于在A线程中调用了B线程的wait方法,当B线程执行完(或者到达等待时间),B线程会自动调用自身的notifyAll方法唤醒A线程,从而达到同步的目的。
2、obj.wait(),当前线程调用对象的wait()方法,当前线程释放对象锁,进入等待队列。依靠notify()/notifyAll()唤醒或者wait(long timeout) timeout时间到自动唤醒。
3、obj.notify()唤醒在此对象监视器上等待的单个线程,选择是任意性的。notifyAll()唤醒在此对象监视器上等待的所有线程。
4、LockSupport.park()/LockSupport.parkNanos(long nanos),LockSupport.parkUntil(long deadlines), 当前线程进入WAITING/TIMED_WAITING状态。对比wait方法,不需要获得锁就可以让线程进入WAITING/TIMED_WAITING状态,需要通过LockSupport.unpark(Thread thread)唤醒。参考:
https://blog.csdn.net/pange1991/article/details/53860651 -
2、线程暂停与恢复、停止
2.1过时方法:
thead.suspend(); //暂停
thead.resume(); //恢复
2.2常用技巧:
- 线程内一般用while循环加一个运行标志,设置运行标志为false即可让线程
自动运行结束,终止,等待回收。不要主动去stop线程。 - 想要重复利用一个线程而又实现暂停效果,就可以用两层while循环,第一层为while(true),
第二层为while(flag), 在第二层中实现特定功能,当flag为flase时,不执行特定功能,实现暂停线程的效果(但实际上线程一直在运行)