201711671106《Java程序设计》第十二章总结

第十二章:Java多线程机制

一:进程与线程

进程:程序的一次动态执行过程,它对应了从代码加载、执行至执行完毕的一个完整过程,这个过程也是进程本身从产生、发展至消亡的过程。

线程:比进程更小的执行单位,一个进程在其执行过程中,可以产生多个线程,形成多条执行线索。没有进程就没有线程。

主线程(main线程)

每个java程序都有一个缺省的主线程main;在执行java程序时候,多个线程轮流执行。

线程的状态:

1.新建:当一个thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态。

在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口

2.运行:用start()方法通知JVM加入新线程,并且重新线程中的run()方法,若线程是thread子类创建,则立即执行run()。

3.中断:通常有4个原因:

(1)JVM将CPU资源从当前线程切换给其他线程,使本线程让出CPU的使用权处于中断状态。
(2)线程使用CPU资源期间执行了sleep方法,使当前线程进入休眠状态。
(3)线程使用CPU资源期间执行了wait( )方法,使得当前线程进入等待状态。
(4)线程使用CPU资源期间执行某个操作进入阻塞状态,比如执行读/写操作引起阻塞。

4.死亡:死亡后就不具有继续运行的能力,通常有两个原因:

1)正常运行的线程完成了他的全部工作

2)被强制性终止,run方法被强制结束

线程调度与优先级:

java虚拟机中的线程调度器负责管理线程,调度器把线程的优先级分成10个级别,分别用thread类中的类变量表示。每个Java的线程的优先级通常在1(Thread.MIN_PRORITY)-10(Thread.MAX_PRORITY)之间,若没有明确设置线程的优先级别,则优先级为5,即(Thread.NORM_PRORITY).优先级可通过setPrority()调整。

Thread类与线程的创建

创建线程对象有两种方法:

1.使用Thread子类方法创建线程对象,需要重写父类中的Run()方法.。优点:可以在子类中增加新的成员变量,使线程具有某种属性,也可以新增方法,具有某种功能。

2.直接用Thread方法创建。——Thread(Runnable target)参数是一个Runnable类型的参数。

目标线程与线程的关系:

1.目标对象和线程完全解耦 2.目标对象组合线程(弱耦合)-可以将线程作为自己的成员

线程常用的方法

1.Start():线程调用该方法启动线程。注:调用后不能再调用。

2.run():定义线程对象被调度之后执行的操作。

3.Sleep(int millsecond):使线程休眠,休眠时间用参数决定。

4.isAlive():在线程新建状态的时候,调用这个方法返回false;死亡后也是返回false;没死前调用返回true。

5.currenThread():返回当前正在使用的线程

6.interrupt():吵醒休眠的线程。

线程同步:

若干个线程都需要使用一个synchronized(同步)修饰的方法,及程序中的若干个线程都需要使用一个方法,而这个方法用synchronized给与了修饰。多个线程都必须遵守机制。

线程同步机制:当一个线程A使用synchronized方法时,其他方法想使用这个方法必须等待,直到A用完。

协调同步的线程:

当一个线程使用的同步方法中用到某个变量,而此变量又需要其他线程修改后才能符合本线程的需要,那么可以在同步方法中使用wait()方法。wait方法可以中断线程的执行使本线程等待,暂时让出CPU的使用权,并允许其他线程使用这个同步方法。在其他线程使用完这份方法后,用notifyAll()方法通知由于使用本方法而等待的线程结束等待。

注:wait()、nitify()和notifyAll()都是final方法,不允许继承,切不可以在非同步方法中使用这三方法。

线程联合:

在线程A占有资源期间,可以让其他线程调用join()和本线程联合,如:B.join();称A在运行期间联合了B。这样A的线程马上中断,直至B完成。

GUI线程:

在Java程序包括图形用户界面时候,虚拟机会启动更多线程如 AWT-EventQuecue和AWT-WIndows。

AWT-EventQuecue:处理GUI事件  

AWT-WIndows:负责将窗体或组件绘制到桌面。

计时器线程Timer:

构造方法:Timer(int a,Object b) 参数a是毫秒,b是计时器的监视器。

计时器次数设置:setRepeats(boolean b) b取false则只运行一次。

守护线程:

线程默认为非守护线程,称作user用户线程。调用void setDaemon(boolean on)方法将自己设置成一个守护线程。

猜你喜欢

转载自blog.csdn.net/Vring_Jan/article/details/84892084