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

Java 复习笔记 线程Thread

2014-11-13 09:53 218 查看
1概念:

进程:运行中的应用程序

线程:进程中的一个执行流程

2区别

进程有独立的进程空间,进程中的数据存放空间(堆空间和栈空间)是独立的。

线程的堆空间是共享的,栈空间是独立的,线程消耗的资源也比进程小,相互之间可以

影响的。

多线程目的:多线程是为了同步完成多项任务

3创建线程的方式

a继承java.lang.Thread类1、重写run()方法2、创建线程对象3、启动线程:start()

b实现java.lang.Runnable接口1、实现接口Runnable中的抽象方法run()2、创建线程对

象3、启动线程start()

4以上两种方式的区别

A extends Thread:

简单不能再继承其他类了(Java单继承)

同份资源不共享

A implements Runnable:(推荐)

多个线程共享一个目标资源,适合多线程处理同一份资源

该类还可以继承其他类,也可以实现其他接口

5线程的生命周期



新建状态:用new语句创建的线程对象处于新建状态,此时它和其他Java对象一样,仅被分配了内存

就绪状态:当一个线程对象创建后,其他线程调用它的start()方法,该线程就进入就绪状态。处于这个状态的线程位于Java虚拟机的可运行池中,等待CPU的使用权

运行状态:处于这个状态的线程占用CPU,执行程序代码

阻塞状态:阻塞状态是指线程因为某些原因放弃CPU,暂时停止运行

死亡状态:当线程执行完run()方法中的代码,或者遇到了未捕获的异常,就会退出run()方法,此时就进入死亡状态,该线程结束生命周期。

6线程调度的两种方法

定义:线程的调度是指按照特定的机制为多个线程分配CPU的使用权,有两种调度模型:分时调度模型和抢占式调度模

分时调度模型:让所有线程轮流获得CPU的使用权,并且平均分配每个线程占用CPU时间片。

抢占式调度模型:优先让可运行池中优先级高的线程占用CPU,如果可运行池中线程的优先级相同,那么就随机地选择一个线程,使其占用CPU。

7如何调整线程优先级

a设置线程的优先级(Thread类的setPriority(int)和getPriority方法分别用来设置和

读取线程的优先级。优先级用整数表示,取值范围是1-10,Thread类有3个静态常量:

MAX_PRIORITY:取值为10,表示最高优先级

MIN_PRIORITY:取值为1,表示最低优先级

NORM_PRIORITY:取值为5,表示普通优先级。这是所有线程默认的优先级



b让处于运行状态的线程调用Thread.sleep()方法

c让处于运行状态的线程调用Thread.yield()方法

d让处于运行状态的线程调用另一个线程的join()方法

8线程睡眠Thread.sleep()方法

当一个线程在运行中执行了sleep()方法,它就会放弃CPU,转到阻塞状态,当线程结束睡眠,首先转到就绪状态,假如此时CPU正被其他线程占用,那么此线程不一定立刻会运行,而是在可运行池中等待获得CPU。

9线程让步:Thread.yield()方法

当线程在运行中执行了Thread类的yield()静态方法,如果此时具有相同优先级的其他

线程处于就绪状态,yield()方法将把当前运行的线程放到可运行池中,给其他线程一

个运行的机会。如果没有相同优先级的可运行进程,yield()方法什么都不做。

10等待其他线程结束:join()

当前运行的线程可以调用另一个线程的join()方法,当前运行的线程将转到阻塞状态,直至另一个线程运行结束,它才恢复运行。

11线程同步

A导致安全问题的出现的原因:

a多个线程访问出现延迟

b线程随机性。

B如何解决:如果想解决这样的问题,就必须使用同步,所谓的同步就是指多个操作在同一时间段内只能有一个线程进行,其他线程要等待此线程完成之后才可以继续执行java中使用synchronized来进行同步,当某个对象被synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。

12同步的缺点

实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。

死锁:当两个线程相互等着对方释放同步监听器;等着要对方的结果后才能继续执行就会发生死锁。例如:

男对女说:你先嫁给我,我再给你买房子。

女对男说:你先给我买房子,我再嫁给你。

13线程通信

不同的线程执行不同的任务,如果这些任务有某种联系,线程之间必须能够通信,协调完成工作。例如,服务员和客人共同操纵果盘,当果盘为空时,客人无法取出桃子,客人应该先通知服务员为果盘装满桃子。当果盘不空时,服务员不用为果盘装满桃子,服务员应该先通知客人从果盘中取出桃子。

例子中的通知就是一种通信

Java中提供了以下几个用于线程通信的方法

wait()

notify()

notifyAll()

详解:

wait():执行该方法的线程释放对象的锁,java虚拟机把该线程放到该对象的等待池中。该线程等待其他线程将它唤醒。

notify():执行该方法的线程唤醒在对象的等待池中等待的一个线程。Java虚拟机从对象的等待池中随机地选择一个线程,把它转到对象的锁池中。

notifyAll():执行该方法的线程唤醒在对象的等待池中等待的所有线程

此三种方法的调用条件:

wait()、notify()、notifyAll(),这三个方法属于Object 不属于 Thread,这三个方法必须由同步监视对象来调用,两种情况:

1.synchronized修饰的方法,因为该类的默认实例(this)就是同步监视器,所以可以在同步方法中调用这三个方法;

2.synchronized修饰的同步代码块,同步监视器是括号里的对象,所以必须使用该对象调用这三个方法;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: