Java多线程基础学习
来源:互联网 发布:php棋牌游戏源码下载 编辑:程序博客网 时间:2024/05/22 06:39
1、程序(program)是为了完成特定任务、用某种语言编写的一组指定集合。即一段静态代码,静态对象
2、进程(process)是程序的一次执行过程,或是正在运行的一个程序。动态过程:有它自身的产生、存在和消亡过程(程序是静态的、进程是动态的)
3、线程(thread):进行可以进一步细化为线程,是一个程序内部的一条执行路径
若一个程序可以同一时间执行多个线程,就是支持多线程的
4、多线程的创建和启动:
Java语言的JVM允许程序运行多个线程,他通过java.lang.Thread类来实现的。
Thread类的特征:
每个线程都是通过某个特定Thread对象的run()方法来完成操作的,经常把run()方法的主体称为线程体
通过该Thread对象的start()方法来调用这个线程(一个对象只能执行一次start()方法)
5、Thread的常用方法:
① start() 启动线程并执行相应的run()方法
② run() 子线程要执行的代码放入run() 方法中
③ currentThread() 静态的,调取当前的线程
④ getName() 获取此线程的名字
⑤ setName() 设置此线程的名字
⑥ yield() 调用此方法的线程释放当前CPU的执行权(但可直接参与CPU执行权竞争)
⑦ join() 在A线程中调用B线程的join()方法,表示,当执行此方法,A线程停止执行,直至B线程执行完毕,A线程再接着join()之后的代码执行
⑧ isAlive() 判断该线程是否还存活
⑨ sleep(long l) 显示的让当前线程睡眠l 毫秒(1000毫秒=1秒)
⑩ 线程通信:wait() notify() notifyAll()
6、线程的调度:
调度策略
时间片
抢占式:高优先级的线程抢占CPU
Java的调度方法:
同优先级线程组成先进先出队列(先到先服务),使用时间片策略
对高级优先级,使用优先调度的抢占式策略
7、线程的优先级:
线程的优先级控制:
- MAX_PRIORITY(10) 常量
- MIN_PRIORITY(1)
- NORM_PRIORITY(5)
涉及的方法:
- getPriority() : 返回线程优先值
- setPriority(int newPriority) : 改变线程的优先级
- 线程创建时继承父线程的优先级
8、创建多线程的方式二,通过实现的方式:
① 创建一个实现了Runnable接口的类
② 实现接口的抽象方法
③ 创建一个Runnable接口实现类的对象
④
9、对比一下继承方式和 实现方式
① 联系:Thread本身就是实现Runnable接口
② 实现的方式优于继承的方式:
实现方式避免了Java单继承的局限性
如果多个线程要操作同一份资源(数据)更适合使用实现的方式
10、使用多线程的优点:
① 提高应用程序的响应。对图形化界面更有意义,可增强用户体验
② 提高计算机系统CPU的利用率
③ 改善程序结构。将既长又复杂的进程分为多个线程,独立运行,利于理解和修改
11、线程的分类:
Java中的线程分为两类:一种是守护线程,一种是用户线程
① 他们几乎每一个方面都是相同的,唯一的区别是判断JVM何时离开
② 守护线程是用来服务用户线程的,通过在start()方法前调用Thread.setDaemon(true)可以把一个用户线程变成守护线程
③ Java垃圾回收就是一个典型的守护线程
④ 若JVM中都是守护线程,当前JVM将退出
12、线程的生命周期:
JDK中用Thread.State枚举表示了线程的几种状态
要想实现多线程,必须在主线程中创建新的线程对象。Java语言使用Thread类及其子类的对象来表示线程,在它的一个完整的生命周期中通常要经历如下五种状态:
新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处理新建状态
就绪:处于新建状态的线程被start()后,将进入线程队列等待CPU时间片,此时它具备了运行条件
运行:当就绪的线程被调度并获得处理器资源时,便进入运行状态,run()方法定义了线程的操作和功能
阻塞:在某种特殊情况下,被人为挂起或执行输入输出操作时,让出CPU并临时终止自己的执行,进入阻塞状态
死亡:线程完成了它的全部工作或线程提前强制性地中止
13、Java如何实现线程的安全,线程同步机制
① 同步代码块:
Synchronized(同步监视器){
//需要被同步的代码块(即为操作共享数据的代码)
}
1、共享数据:多个线程共同操作的同一个数据(变量)
2、同步监视器:有任何一个类的对象充当,哪个对象获取此监视器,谁就执行大括号里的同步代码
要求:所有线程必须共同同一把锁(即同一个同步监视器)
注:在实现方式中,考虑同步的话,可以使用this充当锁,但是在继承的方式中,慎重使用this(因为继承时造的是多个对象,this仅代表当前对象,也就是每一个对象都具备一把锁,无法实现同步)
② 同步方法:将操作共享数据的方法声明为synchronized,即此方法为同步方法,能够保证其中一个线程执行此方法,其他线程在外等待直至此线程执行完此方法
>同步方法的锁,this(默认 )
注:不能使用在继承Thread中
线程的同步弊端:由于同一个时间只能有一个线程访问共享数据,速率降低了
14、互斥锁:
在Java语言中,引入了对象互斥锁的概念,来保证共享数据操作的完整性。
- 每个对象都对应于一个可称为“互斥锁”标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象
- 关键字synchronized来与对象的互斥锁联系。当某个对象用synchronized修饰时,表明该对象在任一时刻只能由一个线程访问。
- 同步的局限性,导致程序的执行效率要降低
- 同步方法(非静态的)的锁为this
- 同步方法(静态的)的锁为当前类本身
15、释放锁的操作:
当前线程的同步方法、同步代码块执行结束
当前线程在同步代码块、同步方法中遇到break、return终止了该代码块、该方法的继续执行。
当前线程在同步代码块、同步方法中出现了未处理的Error或Exception,导致异常结束
当前线程在同步代码块、同步方法中执行了线程对象wait()方法,当前线程暂停,并释放锁
16、不会释放锁的操作:
线程执行同步代码块或同步方法时,程序调用Thread.sleep()、Thread.yield()方法暂停当前线程的执行
线程执行同步代码块,其他线程调用了该线程的suspend()方法将该线程挂起,该线程不会释放锁(同步监视器)
注:应尽量避免使用suspend() 和 resume() 来控制线程
17、线程的死锁问题:
死锁:不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁。
解决方法:
专门的算法、原则
尽量减少同步资源的定义
18、线程通信:
wait() 与 nofity() 和 nofityAll() (没有定义在Thread中,定义在Object中)
- wait() : 令当前线程挂起并放弃CPU、同步资源,使别的线程可访问并修改共享资源,而当前线程排队等候再次对资源的访问
- nofity() : 唤醒正在排队等待同步资源的线程中优先级最高者结束等待
- nofityAll() : 唤醒正在排队等待资源的所有线程结束等待
java.lang.Object 提供的这三个方法只有在synchronized方法或synchronized代码块中才能使用,否则会报java.lang.IllegalMonitorStateException异常
19、分析:
① 是否涉及到多线程的问题?是!生产者、消费者
② 是否涉及共享数据?有!考虑线程安全
③ 此共享数据时谁?即为产品数量
④ 是否涉及线程的通信?存在这个生产者与消费者通信
- java基础学习--多线程
- Java多线程基础学习
- Java多线程基础学习
- java多线程基础学习2
- java基础学习多线程学习笔记
- java多线程技术学习(1)--java多线程基础
- java基础学习要点六:多线程
- java基础学习笔记_多线程
- 黑马程序员-----Java基础学习多线程
- java基础学习之 多线程 概述
- java多线程基础学习-核心编程
- 黑马程序员—java基础学习--多线程
- 黑马程序员------Java基础学习------多线程
- 学习笔记--java基础--多线程基本概念
- Java基础-多线程学习(上)
- Java基础-多线程学习(下)
- JAVA多线程的总结学习-基础
- java基础学习——多线程
- Android Touch事件分发过程
- 在分组情况下,同一个字段不相同的SQL
- 代码片段
- 传真文档自动化处理的应用实例
- strcpy,memcpy,memmove,memset
- Java多线程基础学习
- 养成良好的项目文件上传习惯
- 随机验证码(线条,旋转,干扰线)
- 简化PHP开发的10个工具
- 启用QNX系统,海尔智能冰箱或成业界“宝马”
- typedef函数指针用法 assert()
- JavaScript Scope( 作用域 ) , Scope chain( 作用域链 )
- 编写类String 的构造函数、析构函数和赋值函数
- myEclipse2014 python开发环境搭建