Java学习笔记(五、多线程)

8.1线程的基本概念
    程序是一段代码,是静态的。
    进程是程序的一次执行过程,是动态的,从代码加载、执行,直到完成的一个完整过程。
    线程是一个控制流,也是一个执行过程,但执行单位比进程小。一个进程在其执行过程中可以产生多个线程。
    线程和进程的比较,它们的共同点是,都是程序的一个执行过程。不同点是 进程是一个实体,每个进程都有自己的状态、专用数据段;同一个进程下的线程则共享进程的数据段。创建进程时,必须建立其专用数据段;创建线程时不必建立新的数据段。线程不能是独立运行的程序,而只是某个进程内的一个执行流。
    线程的建立和线程间的切换速度大大超过进程,不需要数据段的保护和恢复。同时,又具备进程的大多数优点。缺点是由于多个线程共享数据段,带来数据访问过程中的互斥和同步问题。
8.1.1线程的生命周期
    一个线程“创建->工作->死亡”的过程称为线程的生命周期。共有5个状态:新建状态、就绪状态、运行状态。阻塞状态和死亡状态。
1、新建状态
    指创建一个线程,但是它还没有启动。处于新建状态的线程对象,只能被启动或终止。Thread mythread=new Thread();
2、就绪状态
    是当线程处于新建状态后,调用了start()方法后。就绪状态线程具备了运行条件,但尚未进入运行状态。
3、运行状态
    是某个就绪状态的线程获得cpu资源,正在运行。如果有更高优先级的线程进入就绪状态,则该线程将被迫放弃对cpu的控制权,进入就绪状态。使用yield()方法可以是线程主动放弃cpu。线程也可能由于执行结束或执行stop方法进入死亡状态。每个线程对象都有一个run()方法,当线程对象开始执行时,系统就调用该对象的run方法。
4、阻塞状态
    是正在运行的线程遇到某个特殊情况。例如,延迟,挂起等。进入阻塞状态的线程让出cpu,并暂时停止自己的执行。线程进入阻塞状态后,就一直等待,直到引起阻塞的原因被消除,线程就又转入就绪状态。
    线程从阻塞状态恢复到就绪状态,有三种途径:自动恢复;调用resume方法恢复,用notify或notifyAll方法通知恢复。也可能因为别的线程强制某个处于阻塞状态的线程终止,该线程就从阻塞状态进入死亡状态。
5、死亡状态
    是指线程不再具有继续运行的能力,也不能再转到其他状态。一般有两种情况使一个线程终止,进入死亡状态。一是线程完成了全部工作。一是线程被提前强制性终止。
8.1.2线程调度与优先级
    java提供一个线程调度器来监视和控制就绪状态的线程。线程的调度策略采用抢占式,优先级高的线程比优先级低的线程优先执行。在优先级相同的情况下,就按先到先服务的原则。
    每个java程序都有一个默认的主线程,就是通过jvm启动的第一个线程。对于应用程序,主线程执行的就是main()方法。对于Applet,主线程指浏览器加载并执行小应用程序的那个线程。子线程是由应用程序创建的线程。另有一种线程成为守护线程,是一种用于监视其他线程工作的服务线程,它的优先级最低。
8.2 Thread类和Runnable接口
    java程序实现多线程应用有2种途径:一是继承Thread类,用Thread子类创建线程对象。二是在类中实现Runnable接口,在类中提供Runnable接口的run方法。程序员能控制的关键性工作有两个方面:一是编写线程的run方法;二是建立线程实例。
8.2.1 用Thread子类实现多线程
    先声明一个Thread类的子类,并在子类中重新定义run方法。当程序需要建立线程时,就可创建Thread子类的实例,并让创建的线程调用start方法,这时,run方法将自动执行。
8.2.2 Runnable 接口
    只有run方法需要实现。一个实现Runnable接口的类实际上定义了一个在主线程之外的新线程的操作。
8.3 线程互斥和同步
8.3.1线程互斥
    假设有若干线程共享某个变量,且都对变量有修改。如果它们之间不考虑相互协调工作,就会产生混乱。
    解决多线程互斥的方法是,某个线程在使用共享变量时,别的线程暂时等待,等待正在使用共享变量的线程使用结束。等到前一个线程使用结束后,才能让等待使用该变量的线程中的某一个使用它,而别的线程继续等待。
    在java语言中,使用关键字synchronized定义临界段,能对共享对象的操作上锁。
8.3.2 线程同步
    例如,当线程A使用到某个对象,而此对象又需要线程B修改后才能符合本线程的需要,这时线程A就要等待线程B完成修改工作。这种线程相互等待成为线程的同步。
    为了实现同步,java语言提供了wait(),notify(),notifyAll()供线程在临界段中使用。在临界段中使用wait方法,使执行该方法的线程等待,并允许其他线程使用这个临界段。当线程使用完临街段后,用notify方法通知由于想使用这个临界段而处于等待的线程结束等待。notify方法只是通知第一个处于等待的线程。如果某个线程在使用完临界段后,其他早先等待的线程都可结束等待,重新竞争cpu,这时可以使用notifyAll方法。
    有三种类型的代码能够作为临界段:类方法,实例方法,一个方法中的代码块。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值