多线程。
进程:是一个正在执行中的程序
每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。
线程:就是进程中的一个独立的控制单元,线程在控制着进程的执行(一个进程中至少有 一个线程)
线程的五种状态:
两种方式创建线程
第一种创建线程的方式:
(1) 写一个类然后继承Thread类重写类里面的run方法。
(2) 调用线程的Start()方法,该方法有两个作用:启动线程,调用run方法。
Thread类中常用的方法:
CurrentThread():返回对当前正在执行的线程对象的引用。
getName()获取线程的名称。
设置线程名称:使用setName或者构造函数。
第二种创建线程的方式
(1) 创建一个类声明实现Runnable接口的类。
(2) 覆盖runnable接口中的run方法
将线程要运行的代码放在该run方法中。
(3) 通过thread类建立线程对象
(4) 将Runnable接口的子类对象作为实际参数传递给thread类的构造函数
为什么要将Runnable接口的子类对象传递给Thread的构造函数。
因为,自定义的run方法所属的对象是Runnable接口的子类对象所以要让线程去指定对象的run方法。就必须明确该run方法所属对象
(5) 调用thread类的Start方法开启线程并调用runnable接口子类的run方法。
多线程实现Runnable接口和继承Thread有什么区别。
Runnzble的好处:避免了单继承的局限性。
继承Thread:线程代码存放Thread子类run方法中。
实现Runnable,线程代码存在接口的子类的run方法中。
线程的同步synchronized
第一种解决方法就是同步代码块
Synchronized(对象)
{
需要被同步的代码
}
对象如同锁。持有锁的线程可以在同步中执行。没有持着锁的线程即使获取cpu的执行权,也进不去,以为没有获取锁。
同步的前提:
(1) 必须要有两个以上的线程。
(2) 必须是多个线程使用同一个锁。
同步的好处:解决了线程的安全问题
同步的坏处:多个线程需要判断锁,消耗了资源,程序会变慢。
第二种解决方法就是同步函数
在函数上面加上synchronized就行了。
同步函数用的是哪一个锁呢?
函数是被对象调用。那么函数有一个所属对象的引用。就是this所以同步函数使用的锁就是this。
如果同步函数被静态修饰后,使用的锁是什么呢?
通过验证发现不是this。因为静态方法中也不可以定义this 静态进内存时,内存中没有本类对象,但是一定又该类对应的字节码文件对象。类名.class 该对象的类型是class
静态的同步方法,使用的锁是该方法所在类的字节码文件对象。类名.class
多线程的——死锁
同步中嵌套同步
线程间通讯:
其实就是多个线程在操作同一个资源。
但是操作的动作不同。
Object类中操作线程的方法 :
Wait: 在其他线程调用此对象的 notify() 方法或 notifyAll() 方法前,导致当前线程等待。
(操作这个方法都要使用异常处理机制try{}catch(){}不能抛异常)
Notify: 唤醒在此对象监视器上等待的单个线程。
对象监视器就是持有的(锁)
notifyAll: 唤醒在此对象监视器上等待的所有线程。线程通过调用其中一个 wait 方法,在对象的监视器上等待。
这些方法都是用在线程的同步中,因为要对持有监视器(锁)的线程操作。所以要使用在同步中,因为只有同步才具有锁。
为什么这些操作线程的方法要定义在object类中?
因为这些方法在操作同步线程时,都必须要标识他们所操作线程只有同一个锁上的被等待线程,可以被同一个锁上notify唤醒,不可以对不同锁中的想成进行唤醒。
也就是等待和唤醒必须是同一把锁。
锁可以是任意对象,所以可以被任意对象调用的方法要定义在object类中。
Jdk1.5以后线程的新特性:
在Java.util.concurrent.locks类包中
Lock接口:Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的 Condition 对象。
Condition接口:Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set(wait-set)。其中,Lock 替代了
synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。
停止线程
守护线程
setDaemon: 将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。
Thread类中的join方法
Join:等待该线程终止。
Join:当A线程执行到了B线程的.join()方法时,A就会等待。等待B线程都执行完,A线程才回执行。Join可以用来临时加入线程执行。