Java学习知识点小结5(多线程)

1.创建多线程方式:
继承Thread类,重写run方法(不是必须实现run方法,默认调用其内部的run方法)
继承Runnable接口,重写run方法(必须实现run方法)(多用接口实现,因为java不能多继承)
继承Callable接口,比较少使用

2.Thread类有start()方法可以将线程交给CPU调度
3.一个类的多个线程实例 共享这个类的线程体!!!

4.线程创建运行方式:
Class A extends Thread{}//继承Thread类
A a=new A();//创建线程类
a.start();//启动,不一定立即执行,由cpu决定运行时间片

Class B implements Runnable{}//继承Runnable接口
B b=new B();
new Thread(b).start();//一样要借助Thread类调用start方法,这里是匿名类的使用,没有声明Thread类

5.Callable接口用法(有单独博客)
创建目标对象 Class C implements Callabe
C c=new C();
ExecutorService ser=Executors.newFixedThreadPool(n);//创建线程池,有几个线程则大小n就为几个
Future result1=ser.submit(线程1) //提交执行
boolean r1=result.get();//获取结果
ser.shutdownNow();//关闭服务

6.静态代理(代理模式和装饰模式很像,但也有区别)
一个类为真实对象
一个类为代理对象
两个类实现一样的接口
代理类,内部含有对真实类的引用(即有一个private 真实类对象,然后构造时传入一个真实类进来),从而可以操作真实对象
在调用真实对象的方法时候,新增自己的方法(附加操作)!

7.Lambda表达式简化线程(用一次!!!)使用:
new Thread( ()->{run方法内线程体} ).start();
相当于匿名内部类的再简化,但是要求被省略的接口内只有一个函数,例如Runable类的run函数

8.线程状态与一些方法:
当调用start()方法,线程开辟自己工作空间,进入就绪态。当线程一旦获得cpu,进去运行态
sleep()方法停止线程运行一段时间,线程处于阻塞态,线程占据着资源,sleep完后线程进入就绪态
join()线程插队,在main里调用会使主线程会等待子线程结束之后才能继续运行
yield()让当前线程暂停,不是阻塞,若没有其他等待执行的线程,当前线程马上恢复执行

9.其他方法:
currentThread();得到当前线程
isAlive();表示线程是否存在
setName();设置代理名称(线程名称)

10.线程终止
线程正常执行完毕
在线程体内加入boolean标识,对外提供方法改变标识

11.线程状态:
NEW//尚未启动的线程
RUNNABLE//在java虚拟机中执行的线程
BLOCKED//被阻塞等待监视器锁定的线程处于此状态
WAITING//等待另一个线程执行特定动作的线程
TIMED_WAITING//等待另一个动作到达指定等待时间的线程处于此状态
TREMINATED//已退出的线程
得到线程的状态:使用getstate类返回一个State对象

12.线程的优先级:
优先级默认为5,其设定建议在start()调用前,优先级不代表绝对先后顺序,只是相对概率
setPriority(int1-10)设定线程优先级
getPriority();获得线程优先级

13.守护线程
setDaemon(true);将线程设置为守护线程,jvm不需要等待它执行完

并发编程:

14.线程不安全的原因:
条件:一个类被多个线程同时访问
线程开辟自己的工作空间,两个工作空间同时拷贝了主存的内容
线程临执行到界值的时候,后续线程越界

12.java的块:
类里包含静态代码块,构造块以及构造函数,同步块
执行顺序:父类静态块,子类静态块,父类构造块,父类构造函数,子类构造块,子类构造函数(存在继承),最后执行子类的普通(局部)块

13.线程同步(使用synchronized 关键字)
两种方法:
synchronized方法:
声明方法时使用:public synchronized void Method(){方法体},即用锁锁住了this对象(因为方法内都是对象的资源)

synchronized块:
如果锁定整个方法依然有错误,可以考虑锁定方法内的某个对象,该对象必须是不变的对象,例如this(不变指的是地址,不是属性)
public Object Method(Object a1){
synchronized(a1){一次只能有一个线程进入,操作a1对象}
}
//synchronized块还可以考虑双重检测提高代码效率,尽量选用

15.在main方法内调用Thread.sleep()会让主线程休眠,在run方法内有循环体的时候,synchronized应该放在循环体内,否则会导致一个线程循环运行。

16.CopyOnWriteArrayList是一种自带锁的list容器,线程安全。

17.避免在同一个代码块,同时持有两个对象锁(防止死锁)

18.定时调度
一个实现类继承TimerTask类,重写run()方法
class MyTask extends TimerTask{
public void run() {}
}
然后定义一个Timer类
Timer timer=new Timer();
timer.schedule(new MyTask(),t1,t2)//放入实现类,t1代表开始时间,t2代表每隔多少毫秒循环一次

复杂的定时调度:quartz框架,具体方法可以下载下来看里面的example

19.happen-before:执行代码的顺序可能与编写代码不一致,即虚拟机优化代码顺序。
在单线程环境下,指令重排不能影响最终的结果

20.volatile是轻量级的synchronized,修饰静态变量,可以实现数据的可见性(同步),高性能的电脑则不需要。volatile修饰的对象创建时禁止指令重排序

21.静态变量被所有的类实例共享

22.Java用“类名.class”表示一个特定类型的类型类,类的实例调用.getClass()获得类型类

23.ThreadLocal<> threadLocal=new ThreadLocal<>();
有set,get,setInitialValue()方法,每个线程开启分一块空间,可以给每个线程set一个值,值是泛型规定的,每个线程之间互不影响
(可以在指定线程内存储数据)

24.锁的分类:
悲观锁:synchronized是独占锁即悲观锁,会导致其他所有需要锁的线程挂起,等待持有锁的线程释放锁
乐观锁:每次不加锁,而是假设没有冲突直接去完成某项操作,如果发生冲突失败,则重试,直到成功。例如:CAS 思想(比较并交换)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值