首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

经验1-暑期结束感悟之剥茧成蝶-线程回顾1

2012-09-14 
心得1--暑期结束感悟之剥茧成蝶-线程回顾1暑假老人默默的离开了,我们也默默的开始新的忙碌,一个暑假过的各

心得1--暑期结束感悟之剥茧成蝶-线程回顾1

      暑假老人默默的离开了,我们也默默的开始新的忙碌,一个暑假过的各种滋味!酸甜苦辣,这个暑假有点空虚,没有像以前一样那样出去打工,而是在家呆了一个月,回想一下虚度的日子颇多,一个月竟然没把android学精!想想后悔不已,家里给拿着高额学费供自己上学,自己却打着学习的幌子玩了数日,刚开始的几天确实感觉挺充实的,上午学习,下午帮父母收拾一下家加上与伙伴玩会陶冶情操!有些日子实在呆不住了就去工地上各种磨练!临近开学的时候居然虚度了一连数日。

学习了几日android有些用处,当时学的时候就想着一边学习新知识顺便把旧知识也复习一下,但是这次学习线程还是感觉有点陌生,学的不扎实啊!一直很纠结怎么精通一门语言,一直在怀疑自己难道自己真的很笨,还是不够用功!

今天复习了暑假前学的线程,感触很深!当时学习这部分知识的时候感觉好陌生,也很彷徨!现在感觉懂是懂了但是仍然没有思路!

先回顾一下基础概念:1.程序:一段静态的代码;进程:程序的一次动态执行过程,它对应从代码加载、执行到执行完毕的一个完整过程;进程也称任务,支持多个进程同时执行的OS就被称为多进程OS或多任务OS。2.不同进程占用不同空间,占用不同内存。3.线程是比进程更小的执行单位,它是在一个进程中独立的控制流,即程序内部的控制流。4.特点:线程不能独立运行,必须依赖于进程,在进程中运行。每个程序至少有一个线程称为主线程。5.在实现线程编程时,首先需要让一个类具备多线程的能力,继承Thread类或实现Runnable接口(Java语言提供了三种实现方式:继承Thread类;实现Runnable接口;使用Timer和TimerTask组合)的类具备多线程的能力,然后创建线程对象,调用对应的启动线程方法即可实现线程编程

下面说一下新的体会:1.开启多线程的优点和缺点:

μ             提高界面程序响应速度。通过使用线程,可以将需要大量时间完成的流程在后台启动单独的线程完成,提高前台界面的相应速度。

μ             充分利用系统资源,提高效率。通过在一个程序内部同时执行多个流程,可以充分利用CPU等系统资源,从而最大限度的发挥硬件的性能。

μ             当程序中的线程数量比较多时,系统将花费大量的时间进行线程的切换,这反而会降低程序的执行效率。但是,相对于优势来说,劣势还是很有限的,所以现在的项目开发中,多线程编程技术得到了广泛的应用

2. 实现Runable接口的方法的好处:避免了单继承的局限性。

     3.线程生命周期图解:          

新建

就绪

运行

死亡

堵塞

start()

CPU可用

任务完成

重点说一下的知识点:L(1)死亡(dead):当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。自然终止:正常运行run()方法后终止;异常终止:调用stop()方法让一个线程终止运行(2)堵塞(blocked):由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。正在睡眠:用sleep(long t) 方法可使线程进入睡眠方式。一个睡眠着的线程在指定的时间过去可进入就绪状态。正在等待:调用wait()方法。(调用notify()方法回到就绪状态)。被另一个线程所阻塞:调用suspend()方法。(调用resume()方法恢复)(3)线程的优先级:把线程从就绪状态进入运行状态的过程叫做线程调度。负责调度工作的机构叫做调度管理器优先级:线程的优先级的取值范围是1~10:  MAX_PRIORITY    =   10;NORM_PRIORITY   =   5;MIN_PRIORITY    =    1。得到或修改线程的优先级:public final int getPriority();
public final void setPriority(int newPriority);(4)一些重要方法:

ˉ         static void sleep(long t) //释放CPU的执行权,不释放锁

ˉ         static void sleep(long millis,int nanos)

ˉ         final void wait()//释放CPU的执行权,释放锁

ˉ         final void notify()

ˉ         static void yied()//可以对当前线程进行临时暂停(让线程将资源释放出来)

ˉ         interrupt()方法:中断线程,但实际上该方法不会中断正在执行的线程,只是将线程的标志位设置成true(可以用isInterrupted()方法测试该线程的中断标记,并不清除中断标记,static的方法interrupted()测试当前执行的线程是否被中断,并且在肯定的情况下,清除当前线程对象的中断标记并返回true)

ˉ         如果线程在调用sleep(),join(),wait()方法时线程被中断,则这些方法会抛出InterruptedException,在catch块中捕获到这个异常时,线程的中断标志位已经被设置成false了 。

ˉ         public final boolean isAlive():将线程标记为守护线程(后台线程):setDaemon(true); 注意该方法要在线程开启前使用。和前台线程一样开启,并抢资源运行,所不同的是,当前台线程都结束后,后台线程会自动结束。无论后台线程处于什么状态都会自动结束

还有一些要特别注意的问题:

μ             线程的特性:随机性,系统在执行多线程程序时只保证线程是交替执行的,至于哪个线程先执行哪个线程后执行,则无法获得保证,需要书写专门的代码才可以保证执行的顺序。

μ             对于同一个线程类,也可以启动多个线程。
Thread2 t2 = new Thread2();   t2.start();
Thread2 t3 = new Thread2();   t3.start();

μ             同一个线程不能启动两次,例如 
Thread2 t2 = new Thread2();
t2.start();          t2.start();   //错误

μ             当自定义线程中的run方法执行完成以后,则自定义线程自然死亡。而对于系统线程来说,只有当main方法执行结束,而且启动的其它线程都结束以后,才会结束。当系统线程执行结束以后,程序的执行才真正结束。

μ             结束线程原理---就是让run方法结束。而run方法中通常会定义循环结构,所以只要控制住循环即可

μ             通过Thread类中的,interrupt():清除线程的冻结状态,但这种强制清除会发生InterruptedException。所以在使用 wait,sleep,join方法的时候都需要进行异常处理

μ             多个线程间共享的数据称为临界资源(Critical Resource),由于是线程调度器负责线程的调度,程序员无法精确控制多线程的交替顺序。因此,多线程对临界资源的访问有时会导致数据的不一致行。

 

 

 

 

热点排行