多线程学习

多线程问题

进程和线程

1.每个进程的内存空间都是独立的
2.一个进程最少包含一个线程
3多线程并不能提高运行速度,只是通过多个线程同时执行提高运行效率
4.JAVA属于抢占式调度,进程释放时间片,线程抢到时间片开始执行,可以设置优先级提高抢到的概率,但也不是稳定抢到

同步与异步

同步:排队执行,效率低,安全
异步:同时执行,效率高,不安全

并发与并行

并发:两个或多个事件在同一时间段内执行
并行:两个或多个事件在同时执行

Thread方法(继承)

1.继承此方法需要重写run方法,通过外部调用start方法运行run方法
2.每个线程都有一份自己的栈内存,共用一份堆内存
3.一个线程调用的方法也会在这个线程中执行

Runnable

通过类实现这个接口,然后实现run方法
class A implements Runnable{
run()
}
使用时创建这个类的对象
A a=new A();
然后创建一个线程并分配给这个任务
Thread t=new Thread(a);
通过start方法执行线程
t.start();
Runnable相比继承Thread的优势
1.更适合多线程同时执行相同的任务
2。由于JAVA是单继承的,如果继承了别的类就不能继承Thread,可以避免单继承的局限性
3.线程与任务本身是分离的,提高程序的健壮性
4.线程池不接受Thread类型的线程

Thread类

构造方法
1.无参
2.一参:Runnable类:任务对象/String类:任务的名称(getName)
3.二参:Runnable➕String
常用方法:
1.getName:返回线程名称
2.getId:返回线程ID
3.getPriority/setPrioiity:返回/设置线程优先级
4.start:开始
5.静态方法sleep:参数为时间,毫秒/毫秒➕纳秒:休眠(也可以无参)
6.setDaemon()参数为布尔类型,true为设置为守护线程(守护线程在所有用户线程死亡后自动死亡)
7.静态方法Thread.currentThread():返回当前线程

线程阻塞

所有比较消耗时间的操作
例如:读取文件,输入数据等等

线程中断

线程中断不要使用stop方法,容易导致资源没释放完全
在线程中设置try catch代码块
然后再需要线程死亡时调用Thread的interrupt方法,此时会给线程打上标记,线程会进入catch代码块,若想要线程死亡直接return即可,死亡前应该释放所有资源

线程安全

1.同步代码块
线程同步:synchronized
格式:synchronized(锁对象){同步代码块(排队)}
参与排队的线程必须拥有同样的锁对象
2.同步方法
在方法的返回值前加synchronized
非静态时锁的对象是this,静态方法的锁的对象是类名.class
3.显式锁
(上面两种都是隐式锁)
在类中创建一个锁:Lock lock=new ReentrantLock()
在要锁住的内容前加上lock.lock();
在要释放锁的时候lock.unlock();
4.公平锁和非公平锁
在Lock lock=new ReentrantLock(true)即可创造公平锁
即先到先得

多线程的通信问题

通过调用Object.wait()方法;线程执行到这里会进入等待,可以传参给予时间限定
然后通过Object.notify/notifyAll方法,线程执行到这里会唤醒随机一个//全部等待的线程

线程池

线程池的原理是创建一个有多个线程的集合,然后传入一个任务列表,线程池的线程分为空闲和忙碌,任务列表传来任务时会从线程池中取出一个空闲的线程执行,此时此线程变为忙碌,执行完毕后变回空闲,如果全部线程池都忙碌,则任务列表中新的任务会进行排队等待
另外还有不定长的线程池,全部忙碌时传入新的任务则会增加新的线程
4种线程池:
1.缓存线程池:不定长
2.定长线程池
3.单线程线程池
4.周期定长线程池

Lambda表达式

采用的时函数编程思想,更注重方法而非对象
例如:Thread t=new Thread((a)->{b})
t,start();
其中a为参数
b为实际执行的代码,这里为run方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值