多线程

进程和线程

进程:正在进行的程序。每一个进程执行都有一个执行顺序,该顺序是一个执行路径,或叫一个控制单元。
线程:进程内部的一条执行路径或者一个控制单元。
两者的区别:
一个进程至少拥有一个线程,
进程在执行过程中拥有独立的内存单元,而多个线程共享内存

jvm多线程的启动是多线程吗

Java虚拟机jvm启动的是单线程,就有发生内存泄漏的可能,而我们使用Java程序没有出现这样的问题,也就是jvm启动至少俩个线程,一个执行Java程序,一个执行垃圾回收。所以是多线程。

多线程的优势

解决多部分同时运行的问题,提高了效率

线程的弊端

线程太多导致效率降低,因为线程的执行依靠CPU的来回切换

实现多线程的方法

实现多线程可以通过继承Thread类和实现Runnable接口
1.继承Thread类
定义一个类继承Thread类
复写Thread类中的run方法,将线程的任务代码封装到run方法中
直接创建Thread 的子类对象,创建线程
调用start方法,开启线程
2.实现Runnable接口
定义一个类,实现Runnable接口,在该类中复写run方法,创建该类的对象,创建thread类的对象,把runnable子类实现对象作为构造函数的参数。启动线程。
两种方法的区别;
实现runnable接口避免了单继承的局限性
继承thread类线程代码存放在thread子类的run方法中;实现runnable接口线程代码存放在接口的子类的run方法中;在定义线程时,建议使用实现runnable接口,因为几乎所有的多线程都可以使用这种方式实现。

复写run方法

thread类用于描述线程。thread类定义了一个功能,用于存储线程要运行的代码,该存储功能就是run方法。

线程的的几种状态

新建:创建线程对象
就绪:有执行资格,无执行权
运行:有执行资格,有执行权
阻塞:没有执行资格,没有执行权
结束:线程死亡,变成垃圾

sleep和wait方法

1.sleep来自thread类,wait来自object类
2.sleep是thread的静态类方法,谁调用谁去睡觉
3.wait释放资源释放锁,sleep释放资源不释放锁
4.wait只能在同步控制方法或同步控制块中使用,而sleep可以在任何地方使用。

多线程安全问题

同步是用来解决 多线程的安全问题的,在多线程中,同步能控制共享数据的访问。如果没有同步,当一个线程在修改一个共享数据时,而另外一个线程正在使用或者更新同一个共享数据,这样导致程序出现错误。

锁就是对象
锁的作用是保证线程同步,解决线程安全问题
持有锁的线程可以在同步中执行,没有锁的线程即使获得cpu执行权,也进不去。

同步的前提

必须保证两个以上线程
必须是多个线程使用同一个锁,
必须保证同步中只有一个线程在运行

同步的两种表现形式

1.同步代码块
可以指定需要获取哪个对象的同步锁,使用sychronized的代码块同样需要锁,但它的锁可以是任意对象,考虑到安全问题,一般使用同一个对象。
2.同步函数
同步方法是指进入该方法时需要获取this对象的同步锁,在方法上使用sychronized,使用this对象作为锁,也就是当前对象,
在jdk1.5后,用lock锁取代了synchronized。

死锁

两个线程对两个同步对象具有循环依赖时,就会发生死锁。即同步嵌套同步,而锁确不同。

wait notify notifyAll

这些方法只存在于同步中
使用这些方法时必须要指定所属的锁,即被哪个锁调用这些方法
而锁是任意的对象,所以任意对象调用的方法定义在Object中

多线程的通信

多线程间通讯就是多个线程在操作同一资源,但是操作的动作不同。
为什么要通信
多线程并发执行时,如果需要指定线程等待或者唤醒指定线程,那么就需要通信。
怎么通信
在同步代码块中,使用锁对象的wait方法可以让当前线程等待,直到有其他线程唤醒为止。
使用notify方法唤醒一个等待的线程,或者notifyAll唤醒所有等待的线程。
多线程通信用sleep很难实现,睡眠时间很难把握。

lock和condition

lock是个接口,
将同步synchronized替换成了显示的lock操作

停止线程

停止线程的方法只有一种,就是run方法结束。
开启线程运行,运行代码通常是循环体,只要控制循环,就可以让run方法结束,也就结束线程
interrupt :中断线程。

一个对象上两个线程可以调用两个不同的同步实例方法吗?

不能,因为一个对象已经同步了实例方法,线程获取了对象的对象锁。只有执行完该方法释放对象锁才能执行其他同步方法。

守护线程

setDaemon():
守护线程开启后和前台线程共同抢夺cpu的执行权,
当所有前台线程都结束后,守护线程会自动结束。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值