黑马程序员 -- Java基础学习(5)
来源:互联网 发布:js实现拖拽工作流配置 编辑:程序博客网 时间:2024/06/11 19:31
------- android培训、java培训、期待与您交流! ----------
多线程
• 进程:正在执行中的程序 进程执行都有顺序,该顺序是一个执行路径,或者叫一个控制单元• 线程:进程中一个独立的控制单元,控制进程的执行 一个进程中至少有一个线程• jvm启动时有一个进程java.exe 该进程中至少有一个线程,运行的代码存在于main方法中,该线程可以称为主线程 实际上jvm启动时不止一个线程,还有垃圾回收机制的线程▸ 自定义线程 ThreadDemo.java▸ 第一种方法:继承Thread类 class Demo extends Thread { public void run() { … } } Demo d = new Demo(); d.start();• 1.定义类继承Tread• 2.重写Thread类中的run方法 重写的原因:Thread类用于描述线程,类中定义了一个功能用于存储要运行的代码,即run方法 目的:将自定义的代码存储在run方法中让线程运行▸ 3.调用start方法• 启动线程• 调用run方法• 若只调用run,则没有运行创建的线程,只是单独运行run方法• 例子:TreadTest.java▸ 第二种方法:声明实现Runnable接口的类 new Thread(d).start();
• 定义类实现Runnable接口
• 重写Runnable接口中的run方法
将线程要运行的代码存放在该run方法中
• 通过Thread类建立线程对象
• 将Runnable接口的子类对象作为实参传递给Thread类的构造函数
自定义的run方法所属对象是Runnable接口的子类对象
要让线程运行指定对象的run方法必需明确run方法来自哪个对象
• 调用Thread类的start方法开启线程并调用Runnable接口子类的run方法
▸ 两种方法的区别
• 实现方式的好处:避免单继承的局限性
java只有单继承,如果已经继承了某个类,就无法继承Thread类
定义线程时建议使用实现方式
▸ 区别:线程代码存放位置
• 继承Thread:Thread子类的run方法中
• 实现Runnable:接口子类的run方法中
• 对于单核在某一时刻只能有一个程序在运行,CPU快速切换以达到同时运行的效果
多线程的运行可以看成CPU执行权的抢夺,特点:随机性
▸ 线程的运行状态
▸ 获取线程对象以及名称 ThreadTest.java• 线程有自己的默认名称 Thread-编号,从零开始• 设置线程名 super(name); setName() • static Thread currentThread() 返回当前线程对象的引用 Thread.currentThread().getName(); this.getName(); 对于第一种定义方法以上两种写法效果一样• 卖票程序 TicketDemo.java▸ 线程安全问题 TicketDemo2.java• 出现原因:多条语句在操作同一个线程共享数据是,一个线程还没有执行完时另一个线程参与进来• 解决方法:一个线程的执行过程中其他线程不可以参与、访问▸ 同步代码块 synchronized(对象) { 需要同步的代码 }• 银行存钱例子 BankDemo.java▸ 同步函数 用synchronized修饰• 同步函数使用的锁是this• 静态同步函数使用的锁是class 静态函数中不能使用this 进内存中没有本类对象,但是一定有该类对应的字节码文件对象 所以静态同步方法使用的锁是该方法所在类的字节码文件对象 类名.class• 死锁 DeadLockTest.java▸ 线程间通信• 就是多个线程在操作同一个资源,但是操作的动作不同 InputOutputDemo.java▸ 等待唤醒机制 wait() notify() InputOutputDemo2.java• 等待时线程存在线程池中• wait notify notifyAll方法是Object类中的,但是只用在同步中,因为要对持有监视器(锁)的线程进行操作• 之所以定义在Object类中,是因为在操作同步线程时,必须在前面加上锁对象的名字,wait和notify必须由同一个锁完成
而锁可以是任意对象,可以被任意对象调用的方法必须定义在Object类中▸ 生产者消费者 ProducerConsumerDemo.java 用while判断标志 notifyAll▸ 停止线程• stop方法已经过时▸ run方法结束时线程会结束• 多线程代码多是循环结构,控制住循环就可以让run方法结束• 当线程冻结时,不会读到表姐,也就无法退出循环 此时可以使用interrupt方法,将处于冻结状态的线程恢复到运行状态▸ Tread类的其他方法• setDemon 守护线程(后台线程) 当正在运行的线程都是守护线程时,jvm退出• join() 抢夺cpu执行权 临时加入线程运行 主线程只有等join的线程执行完才会接触冻结 JoinDemo.java• toString() 线程组 优先级▸ 优先级:默认为5• yield():暂停当前正在执行的线程对象,执行其他线程• 需要单独运行某些代码时,封装为线程运行 new Thread() { public void run() { … } }.start(); Runnable r = new Runnable() { public void run() { … } }; new Thread(r).start();
0 0
- 黑马程序员 -- Java基础学习(5)
- 黑马程序员 java基础学习笔记5
- 黑马程序员 -- Java基础学习(1)
- 黑马程序员 -- Java基础学习(2)
- 黑马程序员 -- Java基础学习(3)
- 黑马程序员 -- Java基础学习(4)
- 黑马程序员 -- Java基础学习(6)
- 黑马程序员 -- Java基础学习(7)
- 黑马程序员 -- Java基础学习(8)
- 黑马程序员 -- Java基础学习(9)
- 黑马程序员 -- Java基础学习(10)
- 黑马程序员 -- Java基础学习(11)
- 黑马程序员-Java基础学习(函数)
- 黑马程序员-Java基础学习(数组)
- 黑马程序员——java基础学习日记(5)
- 黑马程序员-JAVA基础学习
- 黑马程序员----java基础加强(5)
- 黑马程序员--Java基础学习十(Java线程)
- 比memcpy更快的内存拷贝【转】
- 数据结构C++版第7章节笔记
- 【公告】博客数据异常已全部恢复
- ContentProvider和Uri详解
- AsyncHttpClient使用教程(一)(翻译自Github)
- 黑马程序员 -- Java基础学习(5)
- Java 异常
- 关于11月28日CSDN遭受网络攻击的情况说明
- 千里之行始于足下——编译器助手(binutils与elf文件)
- 用docker搭建spark集群
- wujiepei_520霸榜可否?
- 这个不用了,用另一个帐号,有更多我的分享
- 愚者的亡途
- String.split方法中的特殊字符问题