1.线程安全
代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果以及变量的值并不存在二义性,就是线程安全。
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
2.线程与进程的联系与区别
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他线程共享进程所拥有的全部资源。
线程的好处:1)易于调度; 2)提高并发性; 3)开销少; 4)利于充分发挥多处理器的功能。
进程和线程的关系:
1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程;
2)资源分配给进程,同一进程的所有线程共享该进程的所有资源;
3)处理机分给线程,即真正在处理机上运行的是线程。
4)线程在执行过程中,需要协作同步,不同进程的线程间要利用消息通信的办法实现同步。
线程与进程的区别:
1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位;
2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可以并发执行;
3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源;
4)系统开销:在创建或撤销进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤销线程时的开销。
3.同步和互斥的区别
当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源。
所谓互斥,是指散布在不同进程之间的若干程序片段,当某个进程运行其中一个程序片段时,其他进程就不能运行它们之中的任一程序片段,只能等到该进程运行完这个程序片段后才可以运行。如果用对资源的访问来定义的话,互斥某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
所谓同步,是指散布在不同进程之间的若干程序片段,它们的运行必须严格按照规定的某种先后次序来运行,这种先后次序依赖于要完成的特定的任务。如果用对资源的访问来定义的话,同步是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。
4.Android中子线程访问UI线程的方法
1)Activity.runOnUiThread(Runnable);
2)View.post(Runnable);
3)View.postDelayed(Runnable, long);
4)Hanlder
5.MessageQueue,Handler,Looper相关介绍
1)Handler:每个Handler可以执行一个线程对象(Runnable实现),也可以发送和处理消息。通过Handler可以发布或处理一个消息或是一个Runnable实例。每个Handler都会与唯一的一个线程以及该线程的消息队列管理。当创建一个新的Handler时,默认将其关联到创建它的线程和该线程的消息队列。换言之,如果通过Handler发布消息,消息只会发送到与它关联的消息队列中,也只能处理该消息队列中的消息。
Handler在无参数的构造方法中调用Looper.myLooper()方法,就是从当前线程里获取一个Looper对象,如果没有则创建。在对Looper初始化的同时一并初始化MessageQueue,并从中得到Looper的MessageQueue。可以看出Handler就是Looper和MessageQueue的管理者和调度者。
2)Message:是线程之间传递信息的载体,包含了对消息的描述和任一的数据对象。Message中包含了两个额外的int字段和一个object字段,这样在大部分情况下,使用者就不需要在做内存分配工作了。获取Message对象时最好使用Message.obtain()函数和Handler.obtainMessage()函数,因为Message的实现中包含了回收再利用的机制,可以提供效率。Message.obtain()是通过从全局Message pool中读取一个Message,回收的时候也是将该Message放入到pool中。
3)MessageQueue:是一个消息队列,用来存放通过Handler发布的消息。消息队列通常附属于某一个创建它的线程,可以通过Looper.myQueue()得到当前线程的消息队列。
4)Looper:用来为一个线程维护一个消息队列,默认的线程是没有和一个Looper实例关联的,需要在线程中使用Loop.prepare();关联一个线程,使用Looper.loop()处理消息直到结束。Looper扮演着一个Handler和消息队列之间通讯桥梁的角色。程序组建首先通过Hander吧消息传递给Looper,Looper把消息放入队列。Looper也把消息队列里的消息广播给所有的Handler,Handler接受到消息后调用handleessge进行处理。Looper实质上是对当前线程,ThreadLocal,MessageQueue的封装,也就是负责多线程之间传递消息的一个循环器。
Android 多线程Task android 多线程 局部变量
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章