[好程序员训练营]----java基础之多线程部分学习笔记
来源:互联网 发布:岛希斯洛普 知乎 编辑:程序博客网 时间:2024/05/16 01:27
<A href="http://www.goodprogrammer.org/" target="blank">android培训</a>------我的java笔记,期待与您交流!
学习java基础部分也好久了,今天抽空把之前学习的多线程部分的笔记记录一下,算是对我多线程部分的总结吧
废话不多说开始了.
1,首先什么是多线程?
说到线程那我们不得不说一下什么是进程,进程就是 正在运行的程序,使系统进行资源分配和调用的独立单位,每一个进程程都有他自己的内存空间和系统资源
而线程就是进程中的单个顺序控制流,是一条执行路径,这里线程分为单线程和多线程,所谓的单线程就是一个进程只有一条执行路径,多线程就是一个进程有多条执行路径.
那么使用多线程有何作用呢?
使用多进程是提高了CPU的执行效率,而使用多线程那必须是提高了程序的执行效率,不必因为一个线程任务没做完,后面的所有任务代码都无法执行一直在等着,那样太糟糕了
2,java程序的运行原理?
java程序运行首先是启动jvm,然后由jvm去启动一个进程,而该进程会主动去启动一个主线程,而主线程会去调用某一个类的main(),所以main()是在主线程中运行的,
进而各个线程的入口便由此开始.
3,java中实现多线程的方法一般有2种分别是继承Thread类和实现Runnable接口,其实有3种方法,但是第三种不常用故这里就不说了.
继承Thread类的方法是 1,定义一个类继承Thread
2,覆写run()方法;
3,创建该类对象并且调用start()方法,从而开启线程并且调用任务的run()方法
实现Runnable接口的方法是 1,定义一个类MyThread implements Runnable接口
2,创建该类的对象MyThread mt=newMyThread()作为线程任务对象
3,创建Thread t1=new Thread(mt),这里一定要将该类的对象mt传递给Thread对象
4,Thread类的对象调用start()方法达到开启线程并且调用run().
4,说完了线程的实现,那就要说一说线程的调度问题了
线程的调度有2种方式:分时调度模型和抢占式调度模型.
分时调度模型是:所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间片
抢占式调度模型是:优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个,优先级高的线程获取的 CPU 时间片相对多一些。
而java中采用的是抢占式调度模型,
5,说一说几种常见的控制线程的方法
1,休眠线程:
sleep(long millis) wait()
2,加入线程:
join(), join(long millis)
3,礼让线程
yield()
4,后台线程
setDaemon(boolean on)
5,终止线程
interrupt()
6,这里要说一说一个很重要的知识点那就是线程的生命周期了
线程的生命周期主要分为一下几步:新建,就绪,运行,阻塞,消亡
7,说完了线程的实现和生命周期,那就必须来说一下线程的安全问题了
什么是线程的安全问题呢?还是举一个例子吧,比如实现一个电影院买票程序,用2个线程模拟2个窗口来卖同一堆数量固定的票,
但是2个问题来了:1,同一张票卖了多次 2,竟然出现了负数票
那么出现安全问题的原因是什么呢?
我想主要有三个方面:1,是否有多线程环境
2,是否有共享数据
3,是否有多个语句共同操作共享数据 //我认为这是最主要的,即使有多线程环境和共享数据,但是如果没有多个语句操作它就不会出现安全问题.
那么解决线程安全问题的方法我们一般是通过加锁的方式来解决,主要有一下3种具体方式:
1,使用同步代码块,它的格式是:
synchroized(锁对象){
//这里写你要同步的代码块
}
需要注意的是:同步代码块的锁可以是任意对象
2,使用同步方法来解决线程安全问题,它的使用就是在一个方法上加上synchroized关键字即可,但是一定要注意的是同步方法的锁对象是this,不是任意对象
3,使用静态同步方法来解决线程安全问题,同理就是在static修饰的方法上加上synchroized关键字即可,但是它的锁对象是类名.class,不是其他对象
- [好程序员训练营]----java基础之多线程部分学习笔记
- 【好程序员训练营】Java线程学习
- 黑马程序员—Java基础学习笔记之多线程
- 黑马程序员------java学习笔记之多线程
- 黑马程序员---java学习笔记之多线程
- 黑马程序员-Java学习笔记之多线程
- [好程序员训练营]java基础之IO笔记
- [好程序员训练营]java基础之集合篇笔记
- [好程序员训练营]java基础笔记之new关键字
- [好程序员训练营]java基础笔记之static关键字的学习
- Java基础笔记之多线程
- 黑马程序员 Java学习总结之多线程基础
- JAVA基础学习之多线程
- Java基础学习之多线程
- java基础学习之多线程
- 黑马程序员---java学习笔记之多线程2
- 黑马程序员Java学习笔记之多线程(并发)
- JAVA学习笔记之多线程
- 把c数组类型的文件转成2进制文件
- const 放在函数前后的区别
- IOS开发之应用之间的调用
- 常用快捷键
- fedaro21的图形界面和命令行界面的切换
- [好程序员训练营]----java基础之多线程部分学习笔记
- jQuery全屏滚动插件fullPage.js演示
- 简单易学的机器学习算法——因子分解机(Factorization Machine)
- capture(yuv422) -> h264 encode(yuv420) -> h264 -> h264 decode(yuv420)
- 【一切都是对象】
- HibernateDaoSupport详解
- ClassLoader机制
- jenkins插件pipeline的简单使用
- sysfs