JAVA基础篇多线程

多线程的实现步骤
定义一个类,然后继承Thread
重写Thread的run方法,在run方法中定义线程要执行的任务
创建Thread子类对象
调用start方法启动线程

多线程的原理
栈内存是线程私有的,每一个线程都有一份自己的栈空间,用来运行自己的方法,方法是通过哪个线程调用的,那么方法就会在哪个线程的栈空间中开辟内存

所有线程共享堆内存与方法区

Thread的方法
构造方法 空参构造与带参构造
其他方法 getName 获取当前正在执行的线程对象
Sleep 线程休眠

多线程的第二种实现方式
定义一个类,然后实现Runnable接口
重写Runnable接口中的run方法

Runnable接口并不表示线程,所以实现Runnable接口的类 此时也不是线程类,因为他和Thread没有关系
Runnable接口中只有一个run方法,将来要在run方法中定义线程要执行的任务,所以可以把Runnable看成一个线程任务接口,Runnable的实现类,可以看成线程任务类,里面只有一个run方法,只需要关注线程要执行的任务

线程安全
如果多个线程同时操作,共享的数据,那么就有可能引发线程安全问题
使用 synchronized关键字可以解决线程安全问题
synchronized叫做 同步,可以修饰代码块,也可以修饰方法。
如果synchronized修饰代码块,那么这个代码块叫做同步代码块

格式
synchronized(锁对象){
同步代码块的内容
}

锁对象就是一个普通的java对象,可以是任何类型的
锁对象只是起到一个标记作用,除此之外没有其他作用
同步代码块的作用 只有持有锁的线程才能够进入到同步代码块中

当线程执行到synchronized同步代码块是,会看下这个同步代码块上面有没有锁,如果同步代码块上面有锁,那么该线程会获取这个锁,然后进入到同步代码块,如果同步代码块上面没有锁,那么该线程会在同步代码位置等着获取锁

synchronized虽然可以保证线程安全,但是会牺牲效率
优点是 线程安全,效率低

如果使用synchronized修饰方法,那么这个方法就叫做同步方法,也能解决线程安全问题
格式
修饰符 synchronized 返回值 方法名(参数列表){ 方法体 }
作用
同步方法可以保证只有一个线程才能执行该方法
同步方法相当于给整个代码体加上了synchronized

注意 同步方法也是有锁的
如果同步方法是非静态的,那么锁对象是this
如果同步方法是静态的,那么锁对象是类名.class(字节码对象)

两种解决线程安全问题的方式
同步代码块
同步方法
优缺点
同步代码块 优点是使用起来灵活,缺点是写法不够简洁
同步方法 优点是语法简洁,缺点是使用起来不如同步代码块灵活

在JDK5的时候,提供了一个Lock接口,该接口中有一个方法可以手动获取锁以及释放锁
void lock()获取锁 void unLock()释放锁

Lock是一个接口,如果要用,需要使用显示类,常见的实现类是 ReetrantLock(了解一下就可以这个Lock锁比较浪费资源)

线程状态
新建(new)刚刚创建出来的线程对象处于此状态
运行(runnable)当线程调用start方法后,就进入到了运行状态
手阻塞(blocked)当线程等待获取锁的时候,该线程处于手阻塞状态
无限等待(waiting)当线程调用wait()后会进入到无限等待的状态
计时等待(yimed_waiting)当线程调用sleep(毫秒值)wait(毫秒值)计时等待指的是带有时间的等待
退出(terminated)当线程执行完了自己的run方法或者调用了stop方法,会进入到退出状态

图解
在这里插入图片描述

在Object中有两种方法,一种是让线程等待,一种是唤醒其他线程
void wait()让线程等待,知道有其他线程唤醒他

void wait(long timeout)让线程等待,参数是毫秒值,如果其他线程唤醒它或者指定的时间已到,线程都会醒来
void notify()唤醒一个等待的线程
void notifyAll()唤醒所有等待的线程

wait 和 notify一起使用一般叫做等待唤醒机制,一般用于线程中的通信
wait和notify虽然是Object中的方法,但是不能对象直接获取
这些方法要放在同步代码块或者同步方法中,要通过锁对象去调用
通过哪个锁对象调用notify,那么唤醒的就是通过哪个锁对象调用wait方法等待的线程

死锁的概述,两个以上的线程,每个线程都各自持有一个锁,并且等待其他线程释放锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值