关于多线程的处理,如果是接触的少,实际的开发中也使用的少的话,感觉总是那么抽象
今天参加了公司的多线程培训后才恍然
如何创建线程相信大家都知道,通过继承 Thread 或者是想 Runnable接口
XX.start();一个线程就启动了
但是多线程我们更多的是要需要考虑,死锁,资源共享,线程通信的问题
1、死锁,避免线程的互斥情况,避免资源等待的情况
2、资源共享,通过加锁来控制
3、线程间的通信,通过控制资源,定义公共的数据区域,wait,notify,interrupt来处理。
对应线程的生命周期,可能我们都很少关注如何去停止一个线程,这里说几种处理
a、直接调用stop()方法,这个是不被推荐的,因为它是直接强制停止线程操作,而不会考虑当前线程的处理状态,有时候当线程正在做一些非常重要的处理时,这样直接停止是非常危险的事情。
b、程序直接跑完,其实只要run方法中的代码跑完了,我们的线程生命周期也就是完了
c、通过现场自带的方法:xx.interrupt();
那么在线程的 run方法中调用isInterrupted()就会返回相应的状态,这样就可以自己控制线程结束了。
通过这种方式来结束线程就可以保持线程当前的执行状态,安全的结束,但是这样操作也会有一种情况,如果线程是出于阻塞状态,例如xx.sleep(100000);调用interrupt则会跑出执行不成功的一样,需要在run方法中将这个异常try住,在catch中处理结束线程的操作。
资源加锁synchronized分代码块和方法。
意义都差不多,只是需要根据自己的程序来进行控制,目的都是为了控制只有一个线程在执行目标代码
但是还有一个需要注意的是加锁的级别是对象级还是类级别, 通过 static来进行控制。
wait和notifyAll的使用:
等待还有一个Thread.sleep方法,和wait的区别就是wait会释放资源等待,如果没有notify来唤醒的话,线程将一直等待下去。
使用wait和notify需要注意的是,要确保notity在wait的后面执行,否则notity将不起作用,不过一般都是用notifyAll直接唤醒所有。
MyThread.class.notifyAll()
MyThread.class.wait();
运用多线程执行操作的时候,有时候我们可能要汇总所有线程最后的执行结果,也就需要等待最后一个线程执行完
虽然可以加wait或者其他资源标志位来判断,但在这样处理还是比较麻烦,我们知道里面的原理就ok了
这里推荐一个多线程的框架
Executor
对多线程框架做了很好的控制,有需要的鞋童可以到网上找了看看,这里不做详细介绍了