多线程

gassion永刚、期待与您交流! ----------

多线程。
     进程:是一个正在执行中的程序
           每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。
     线程:就是进程中的一个独立的控制单元,线程在控制着进程的执行(一个进程中至少有    一个线程)
线程的五种状态:


两种方式创建线程
第一种创建线程的方式:
(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可以用来临时加入线程执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值