进程:就是正在运行的程序,分配内存让应用程序可以运行java
Windows 系统号称多任务(能够同时运行多个任务)windows
从宏观上看:windows确实是容许了多个程序运行安全
微观上看:cup快速作了切换执行任务,因为速度特别快,咱们人感受不到这个切换的过程多线程
线程:线程在一个进程中负责代码的执行,就是一个进程中的执行路径jvm
Java程序运行的时候,jvm会帮咱们建立一个主线程来执行代码。主线程也主要负责main方法中的代码执行函数
一个java程序中至少有2个线程this
一个是主线程,只要负责main方法中的代码的执行,一个是垃圾回收器线程,负责垃圾回收spa
多线程:在一个进程中多个线程同时执行不一样的任务。 “同时“:单核cpu快速切换多个线程执行任务,速度特别快,感受不到切换操作系统
多线程的好处:线程
1.解决一个进程中同时执行多个任务的问题
2.提升资源的利用率
多线程的弊端:
1.增长cpu 的负担不是线程愈多愈好
2.下降了一个进程中线程的执行几率
3.线程容易引起线程安全问题
4.容易出现死锁现象
Java 定义两种方法
方式一 : Thread (线程类)
1.须要定义一个类来继承Thread类
2.重写thread类中run方法,把自定义线程的任务代码写在run方法中。 每个线程都有本身的任务代码 ,jvm建立的主线程的任务代码就是main方法,自定义的线程的任务代码就写下run方法中,
自定义的线程就须要来执行run方法中的代码
注意点 :一旦线程开启了,会默认执行线程对象中的run方法, 可是千万不要本身直接调用run方法,若是直接调用了run就和普通方法没有区别。 开启线程 : 继承Tread的子类的对象 . Start();
线程中经常使用的方法。
Thread(String name) 初始化线程的名字
getName() 返回线程的名字
setName(String name) 设置线程对象名
sleep() 线程睡眠指定的毫秒数。
getPriority() 返回当前线程对象的优先级 默认线程的优先级是5
setPriority(int newPriority) 设置线程的优先级 虽然设置了线程的优先级,可是具体的实现取决于底层的操做系统的实现
(最大的优先级是10 ,最小的1 , 默认是5)。
currentThread() 返回CPU正在执行的线程的对象
java给线程加锁 :
方式一:同步代码块
锁对象能够是任意一个java中的对象
java中的任意一个对象 都会有一个对象的状态 ,就能够经过对象的状态来做为锁的一个标识符。
statue = 0 表示锁是关闭 statue = 1 表示锁打开。
synchronized (锁对象) { };
同步代码的使用注意点:
1.任意一个对象均可以作锁对象
2.若是你在同步代码块中调用了sleep,不会释放锁的对象
3.只有真正存在线程安全的时候才须要使用同步代码块,不然会下降执行效率
4.多线程操做锁对象必须是惟一的 ,不然无效
出现线程安全问题的根本缘由:
1.存在两个或两个以上的线程,而且线程之间共享着一个资源
2.多个语句操做了共享资源
方式二:
同步函数:用关键字synchronized 修饰run函数(方法)
同步函数的使用注意点:
1.若是一个非静态的函数 ,同步函数的锁就是调用方法的对象(this 对象),若是是一个静态函数同步函数的锁对象是当前函数所属类的字节码文件(class 对象)
2.同步函数的锁对象是固定的,不可以本身来定
推荐使用:同步代码块
缘由:1.同步代码块的锁对象能够能够有本身任意指定,同步函数是固定
2.同步代码块能够控制同步的范围,同步函数必须是整个函数的全部代码都被同步
3.同步函数是同步整个函数的代码
代码同步是能够解决 线程安全问题
可是若是使用不当会到时线程死锁问题
A线程等B线程,B线程又在等A线程 结果两我的就一直等下去了 ,这个时候就形成了线程死锁。
死锁现象的解决方案 : 没有方案 ,尽可能避免发生。
线程定义的第二种方式:
1.自定义一个类实现Runable接口,接口中会提供一个run方法
2.实现Runable接口中的run方法。将线程中的任务写在run方法中
3.建立Runable接口的实现类对象。
4.建立一个Thread对象,并把Runable实现类建立的对象做为参数。
5.调用Thread对象的start方法来开启线程
问题 : 为何要将Runable接口实现类的对象做为参数传递?
为了让对象中的run方法可以在线程中的run方法中执行。也就是可以将对象中的run方法最为线程中的任务来执行。
推荐使用 :第二种方式 实现Runable.
java 是单继承 ,多实现的 因为java是单继承 ,这个就不能过继承Thread对象来实现多线程
推荐使用第二种方式
线程的通信:一个线程完成本身的任务,去通知另一个线程去完成另一个任务。
wait(); 等待 若是线程执行了wait方法 ,那么该线程就会处于一个等待状态,等待状态的线程必需要经过其余线程来调用
notify()方法来唤醒。
notify();唤醒 随机唤醒线程池中的一个线程。
notifyAll(); 唤醒全部等待的线程
wait和notify的使用注意点 :
1.wait方法和notify方法是属性Object对象
2.wait方法和notify方法必须在同步线程中执行
3.wait方法和notify方法必须有锁对象来调用