For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
相信大家在使用手机的时候,为了提高手机运行速度,会下意识的选择结束进程等优化行为。今天,我们就一起来了解一下这些进程功能是如何实现多线程同步运行的。
什么是多线程:
进程:正在运行的程序,QQ 360 ......
线程:就是进程中一条执行程序的执行路径,一个程序至少有一条执行路径。(360中的杀毒 电脑体检 电脑清理 同时运行的话就需要开启多条路径)
每个线程都有自己需要运行的内容,而这些内容可以称为线程要执行的任务。
开启多线程是为了同时运行多部分代码。
好处:解决了多部分需要同时运行的问题
弊端:如果线程过多,会导致效率很低(因为程序的执行都是CPU做着随机 快速切换来完成的)
JVM在启动时,就有着多个线程启动
在多线程运行过程中,如有线程抛出了异常,那么该线程会停止运行(出栈),但是并不影响其他线程的正常运行。
线程的四种状态:
创建线程:
方法一:继承Thread类
方法二:实现Runnable接口
分析:创建线程的目的是为了开辟一条执行路径,让线程去运行指定的代码(执行路径的任务),实现和其他线程同时执行任务。
JVM创建的主线程任务都定义在了mian方法中;自定义的线程任务将要封装在Thread类的run方法中。
方法一的步骤:1:继承Thread类 2:重写run方法(封装任务) 3:实例化Thread类的子类对象 4:调用start方法开启线程(这个方法会调用run方法来执行任务)
currentThread()是一个静态方法,它返回的是当前正在运行线程的这个对象,然后调用getName方法返回这个线程的名字;
名字是Thread-编号(从0开始),主函数的名字就是main。
Thread类中有个接收String类型参数的构造方法,我们传入的数据可以自定义线程的名字。
如果一个子类已经有了父类,但是它需要开启多线程来执行任务,那么就要用到Runnable这个接口来扩展该子类的功能(避免了java的单继承局限性)
Runnable这个接口只有一个run一个抽象方法,所以Runnable接口的出现仅仅是为了用run封装任务而存在的;而且Thread类也实现了Runnable接口
方法二的步骤:1:实现Runnable接口 2:重写run方法(封装任务) 3:创建Thread线程a 创建Runnable子类对象t
4:将t作为参数传递给a(Thread有个构造方法是用来接收Runnable类型参数的;因为任务都封装在了Runnbale子类的run方法中,
在开启线程的时候就要明确线程的任务,否则Thread会调用自己的run方法,Runnbale子类中的任务将永远不会被执行到)
5:开启线程(start)
多线程安全问题:
原因: 1.多个线程操作共享数据
2.操作共享数据的代码有多条
当一个线程在执行共享数据的多条代码时,有其他的线程参与进来,就会导致线程安全问题的产生。
解决问题:
思路:当有线程操作共享数据的代码块时,不允许其他线程参与进来,即同步(简单说就是给共享数据的代码块安个锁,线程进来的时候都要判断一下是不是有别的线程正在操作共享数据代码块)
同步的好处:解决了安全问题
同步的弊端:相对而言效率降低了(因为每次都需要判断锁)
注意:这几个线程一定要使用同一个锁
方法一:同步代码块
方法二:同步函数
死锁:
同步的嵌套,有两把锁,都拿着对方的锁,导致代码无法继续进行下去。
作者:J.FengS
来源:博客园
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。