您的位置:首页 > 编程语言 > Java开发

JAVA学习总结七

2016-05-16 01:02 429 查看

第十四章 多线程编程

多线程的概念

进程的概念

所有运行中的任务通常对应一个进程(Process)。当一个程序进入到内存中运行时,即变成一个进程。进程是处于运行中的程序,并具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单元。

进程是一种“自包容”的运行程序,有自己的地址空间;

线程的概念

线程是进程内部单一的一个顺序控制流,在进程内部共享内存地址空间。

两者区别

基于进程:一个程序即为一个进程;

基于线程:一个进程再分多任务处理,即线程。线程为最小处理单元。

创建和启动线程的两种方法

声明一个Thread类子类,并覆盖run()方法;

声明一个实现Runnable接口的类,并实现run()方法;

注:子线程与主线程产生后,执行中的地位平等,cpu在子与主线程之间快速切换实现多任务运行

进程包含如下三个特性:

独立性。每个进程都有自己私有的地址空间。

动态性。

并发性。

进程线程关系归纳

单个OS可以同时执行多个任务,每个任务就是一个进程;

单个进程可以同时执行多个任务,每个任务就是一个线程。

多线程的特性

多线程的特性是随机性,多线程在运行时可以理解为他们在互相抢夺CPU资源,谁抢到谁就被执行。至于每个抢到CPU资源的线程执行多长时间,则由CPU说了算。

创建多线程方法的对比

假设要将类A变为多线程类,一般情况下,建议使用“实现Runnable接口”的方法来实现多线程类A的。因为Java是单继承的,通过实现Runable接口做可以为A留下一个继承其它类的机会

注:调用线程类的start()方法使该线程开始执行;虚拟机会去自动调用该线程的run 方法,主线程的代码都存放在main()方法中。

8. 创建多线程后调用run()方法与start()方法的区别

如果仅仅调用run()方法,则结果就是程序还是一个单线程程序;只有调用start()方法,程序才能启动多线程。

run()方法就像个容器,仅仅是封装多线程要运行的代码,并不能启动多线程;Java程序不会创建线程,Java程序通过调用start()方法,然后start()方法调用OS的底层代码,去启动多线程。

9. 实例:

1. 继承Thread类

class ThreadTestextends Thread{

public void run(){

while(true){

System.out.println(“run()方法,返回当前正在执行的线程对象的引用名:”+Thread.currentThread().getName());

}

}

}

public class Demo1 {

public static void main(String[] args) {

new ThreadTest().start();

while(true){

System.out.println(“在主类中的main():返回当前正在执行的线程对象的引用名:”+Thread.currentThread().getName());

}

}

}

解释:继承Thread类的子类中并没有start()方法,而start()方法是父类Thread类中的方法,但由于子类A继承了Thread类,所以子类A也可以调用父类中的start()方法。start()使该线程开始执行;Java虚拟机会自动调用该线程的run 方法实现多线程。

10. 多线程的生命周期

1. 新建状态

指刚new出Thread对象时,此时的线程对象没有表现出任何线程的动态特性,程序也不会执行线程的线程主体。

2. 就绪状态

此时的线程具备运行资格,但没有CPU执行权,就处于等待状态。

当某线程对象调用了start()方法后,该线程对象就处于就绪状态,该线程在等待获得CPU资源的执行权,此时,Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态中的线程并没有开始运行,只是表示该线程可以运行了。至于该线程何时开始运行,取决于JVM里线程调度器的调度。

3. 运行状态

如果处于就绪状态的线程获得了CPU,则开始执行run()方法的线程执行体,则该线程就处于运行状态。

4. 阻塞状态(中断状态)

在main()方法执行中,没有被CPU继续执行时的状态。

产生阻塞状态的5种情况:

1. 由于优先级的关系,线程没有抢到CPU;

2. 使用sleep方法使线程休眠;

3. I/O时间;

4. wait-Notify机制的运行;

5. 挂起

强行退出,不管后续;

5. 死亡状态

线程会以如下3种方式结束,结束后就处于死亡状态。

①run()或call()方法执行完成,线程正常结束。

②线程抛出一个未捕获的Exception或者Error。

③直接调用该线程的stop()方法来结束线程——该方法容易导致死锁,通常不推荐使用。

11. 同步方法

什么是同步方法

同步方法就是用“synchronized”关键字来修饰一个方法,这样的方法被称为同步方法。

对于同步方法而言,无须显示指定同步监视器,同步方法的同步监视器为this,也就是该对象本身。

*函数需要被对象所调用,那么函数都有一个所属对象的引用,就是this,所以同步函数使用的锁就是this。*


2.构造线程安全的类

通过同步方法可以非常方便的实现线程安全的类,线程安全的类具有以下特征:

①改类的对象可以被多个线程安全的访问。

②每个线程调用该对象的任意方法之后,都将得到正确的结果。

③每个线程调用该对象的任意方法之后,该对象的状态依然保持合理的状态。

未完待续;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 多线程