Java(4)--多线程
来源:互联网 发布:linux查询jdk安装路径 编辑:程序博客网 时间:2024/06/15 22:40
首先要理解进程和线程之间的关系,进程是资源分配的最小单元,线程是执行的最小单元,一个进程可以有多个线程组成。
自定义一个线程 查找API文档
java.lang.Thread类中
创建线程的第一个方式:继承Thread类 继承方式
1.定义类继承Thread类
2.复写Thread类中的run方法
3.调用线程中的start方法,该方法有两个作用,启动线程和执行run方法
如果创建对象后直接调用run方法而不去调用start方法,则该线程并没有被创建,仅仅是简单的调用方法,是单线程。
Thread.currenThread返回当前执行线程对象
创建线程的第二个方式:runnable接口 实现方式
1.定义实现Runnable接口
2.覆盖Runnable接口中的run方法 将线程要运行的代码存放在该方法中
3.通过Thread类建立线程对象
4.强Runnable接口的子类对象作为实际参数传递给Thread类的构造函数
为什么要Runnable接口的子类对象传递给Thread构造函数
因为自定义的run方法所属的对象是Runnable接口的子类对象
所以要线程去执行指定对象的run方法,就必须明确该run方法的所属对象
5.调用Thread类的start方法开启线程并调用Runnable接口子类的run方法
实现方式和继承方式有什么区别呢?
原因主要是由于java是单继承方式,不支持多继承 所以接口的提出一定程度上弥补了单继承的缺失,增强了代码的灵活性
实现方式的好处:避免了单继承的局限性
在定义线程时,建议使用实现方式 即增加接口
两种方式的区别: 代码存放位置不同
继承Thread:代码存放在Thread子类的run方法中
接口Runnable:代码存放在接口子类的run方法中
同步的前提
1.必须要有两个或者两个以上的线程
2.必须是多个线程同时使用一个锁
必须保证同步中只能有一个线程在运行
同步的好处是:解决了多线程的安全问题
弊端是:多个线程都需要判断锁是否锁上了,较为消耗资源(在允许范围之内)
如何找问题:
1.明确哪些代码是多线程运行代码
2.明确共享数据
3.明确多线程运行代码中哪些语句是操作共享数据的语句
synchronized 同步
同步函数用的是哪一个锁”
函数需要被对象调用,那么函数都有一个所属对象引用 就是this
所以同步函数使用的锁是this
如果同步函数时被静态修饰后,所用的锁是什么呢
不是this 因为静态方法中不可以定义this ,静态函数在进入内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象,即类名.class 该对象的类型是class
静态的同步方法使用的锁是该方法所在类的字节码文件对象 即类名.class
单例模式中 恶汉式和懒汉式的不同:懒汉式的特点在于延时加载,懒汉式的延时加载会存在问题,如果多个线程访问时会出现安全问题,可以用同步解决
线程间通讯:
其实就是多个线程在操作同一个资源,但是操作的动作不同。
对于多个生产者和消费者。
为什么要定义while判断标记。
原因:让被唤醒的线程再一次判断标记。
为什么定义notifyAll,
因为需要唤醒对方线程。
因为只用notify,容易出现只唤醒本方线程的情况。导致程序中的所有线程都等待。
JDK1.5 中提供了多线程升级解决方案。
将同步Synchronized替换成现实Lock操作。
将Object中的wait,notify notifyAll,替换了Condition对象。
该对象可以Lock锁 进行获取。
该示例中,实现了本方只唤醒对方操作。
Lock:替代了Synchronized
lock
unlock
newCondition()
Condition:替代了Object wait notify notifyAll
await();
signal();
signalAll();
join:
当A线程执行到了B线程的.join()方法时,A就会等待。等B线程都执行完,A才会执行。
join可以用来临时加入线程执行。
如何停止线程?
只有一种,run方法结束。
开启多线程运行,运行代码通常是循环结构。
只要控制住循环,就可以让run方法结束,也就是线程结束。
特殊情况:
当线程处于了冻结状态。
就不会读取到标记。那么线程就不会结束。
当没有指定的方式让冻结的线程恢复到运行状态是,这时需要对冻结进行清除。
强制让线程恢复到运行状态中来。这样就可以操作标记让线程结束。
Thread类提供该方法 interrupt();
- JAVA进阶-多线程(4)
- Java基础--多线程4
- java多线程4--死锁
- Java(4)--多线程
- Java多线程系列(4)
- Java多线程4- Lock、Condition
- Java多线程4- Lock、Condition
- Java多线程 4 同步方法
- java笔记(4)--多线程
- Java多线程设计模式(4
- Java多线程(4)线程组
- 【网络编程4】Java多线程
- Java 多线程4:Condition 接口
- java多线程总结(4)
- 4java多线程实现方式
- java多线程(4)之FutureTask
- java初入多线程4
- 【Java多线程】多线程死锁
- 关于序列的使用,数据库中以自动生成的方式进行保存
- 移动应用—— 获盈利的方式
- 从输入 URL 到页面加载完成的过程中都发生了什么事情?
- LevelDB原理探究与代码分析
- 用SHELL脚本把字符编码转换插到oralce
- Java(4)--多线程
- Redis和Memcached的区别
- google统计ga.js本地化提高网站性能
- hive rcfile存储格式
- Linux终端常用快捷键
- C++ 单冒号: 和双冒号:: 的作用
- Jenkins系列之—02Jenkins安装与配置
- JavaScript一些细节
- openbox设置透明效果