<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,不是其他对象