第一章 多线程背景知识介绍
![](https://img-blog.csdnimg.cn/20191223221809700.png)
第二章 java线程初体验
![](https://img-blog.csdnimg.cn/20191223221959369.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dlbmR5X0hlMDIz,size_16,color_FFFFFF,t_70)
thread.sleep(),休眠一段时间
thread.join(),让其他线程停止,直到本线程结束。
class MyThread extends Thread{};
创建线程:Thread myThread = new MyThread();
启动线程:myThread.start();
2、实现Runnable类
class MyRunnable implements Runnable{}
创建线程:Thread myRunnable = new Thread(new MyRunnable);
启动线程:myRunnable.start();
3、Thread启动后执行run()方法
4、若实现接口通过Thread.currentThread().getName()方法获取当前线程名称,继承Thread则getName()方法获取当前线程。
Thread的构造方法:public Thread(ThreadGroup group,Runable target,String name,Long stackSize)
百度百科volatile的作用是: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
实现Runnable接口比继承Thread类所具有的优势:
1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免java中的单继承的限制
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立。
提醒一下大家:main方法其实也是一个线程。在java中所以的线程都是同时启动的,至于什么时候,哪个先执行,完全看谁先得到CPU的资源。
线程也有可能在子线程结束之前结束。并且子线程不受影响,不会因为主线程的结束而结束。
在java中,每次程序运行至少启动2个线程。一个是main线程,一个是垃圾收集线程。因为每当使用java命令执行一个类的时候,实际上都会启动一个JVM,每一个jVM实习在就是在操作系统中启动了一个进程。
线程的状态
第三章 java线程的正确停止
用stop()方法停止JAVA中的线程是不正确的方法。stop方法使得线程戛然而止,完成了什么工作,哪些工作还没有做,都不知道,且清理工作也没有做,所以不是正确的停止线程方法
正确的停止线程方法是,在线程执行中设置状态标识,通过控制标识来控制线程正常完整的执行结束线程
volatile是保证所有子线程里的变量都能同步到主内存里变量的值,
使用volatile 定义boolean running=true,通过设置标志变量running,来结束线程。
通过 while循环中设置的boolean值来判断是否继续
好处:可以完整的完成循环内的操作 保证流程完整性
interrupt()--初衷并不是用于停止线程
在调用sleep()或者join()的时候,一旦其他线程调用interrupt(),它将会收到一个异常,这些被阻塞的线程因为某些原因需要被唤醒,比如外部发生了中断而需要响应,这时就采用抛出异常的方式来使其作出响应。总而言之,interrupt()方法并不能正确地停止进程
一个线程在阻塞状态下(例如sleep),此时interrupt的话,将会产生两个结果:
1、进程的interrupt状态被清除(cleard)而非被设置(set)。
2、sleep方法会抛出异常。
第四章 线程交互
原因是,每个线程在操作数据时,会先将数据初值读【取到自己获得的内存中】,然后在内存中进行运算后,重新赋值到数据。
争用条件 原因: 线程1在还【未重新将值赋回去时】,线程1阻塞,线程2开始访问该数据,然后进行了修改,之后被阻塞的线程1再获得资源,而将之前计算的值覆盖掉线程2所修改的值,就出现了数据丢失情况
然后通过lockObject的wait方法(注意:wait的线程被存放在wait set 中)和notifyAll方法实现同步。
步骤:
1.互斥:同一时间,只能有一个线程访问数据
2.同步:通信机制;一个线程完成,以某种方式通知其他线程
3.锁的概念:private final Object lockObj = new Object();
4.互斥实现方式:synchronized关键字
synchronized(lockObj){---执行代码----}加锁操作
lockObj.wait();线程等待状态,以避免线程持续申请锁,不去竞争cpu资源
同步:当某些条件满足时,线程通过调用对象监视器的wait(),notify(),notifyAll()方法来实现线程之间的交互!
同步:wait(),notify(),notifyall(),都是属于object类,并不是thread类
notify()唤醒wait set中的一条线程,而notifyall()唤醒所有线程
同步是两个线程之间的一种交互的操作(一个线程发出消息另外一个线程响应)。
同步的实现:wait();notify();notifyAll();这三个方法都是Object对象的成员函数。
![](https://img-blog.csdnimg.cn/20191223222405758.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L1dlbmR5X0hlMDIz,size_16,color_FFFFFF,t_70)