[好程序员训练营]----java基础之多线程部分学习笔记

时间:2021-04-17 00:19:17

<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,这里要说一说一个很重要的知识点那就是线程的生命周期了

线程的生命周期主要分为一下几步:新建,就绪,运行,阻塞,消亡[好程序员训练营]----java基础之多线程部分学习笔记

7,说完了线程的实现和生命周期,那就必须来说一下线程的安全问题了

什么是线程的安全问题呢?还是举一个例子吧,比如实现一个电影院买票程序,用2个线程模拟2个窗口来卖同一堆数量固定的票,

但是2个问题来了:1,同一张票卖了多次   2,竟然出现了负数票

那么出现安全问题的原因是什么呢?

我想主要有三个方面:1,是否有多线程环境

2,是否有共享数据

3,是否有多个语句共同操作共享数据 //我认为这是最主要的,即使有多线程环境和共享数据,但是如果没有多个语句操作它就不会出现安全问题.

那么解决线程安全问题的方法我们一般是通过加锁的方式来解决,主要有一下3种具体方式:

1,使用同步代码块,它的格式是:

synchroized(锁对象){

//这里写你要同步的代码块

}

需要注意的是:同步代码块的锁可以是任意对象

2,使用同步方法来解决线程安全问题,它的使用就是在一个方法上加上synchroized关键字即可,但是一定要注意的是同步方法的锁对象是this,不是任意对象

3,使用静态同步方法来解决线程安全问题,同理就是在static修饰的方法上加上synchroized关键字即可,但是它的锁对象是类名.class,不是其他对象