6、Java基础(4)

Java基础

1、多线程

(1)重要概念

线程就是独立的执行路径。
在程序运行时,即使没有自己创建线程,后台也会有多个线程,如主线程、gc线程。
main()称之为主线程,为系统的入口,用于执行整个程序。
在一个进程中,如果开辟了多个线程,线程的运行由调度器安排调度,调度器 是与操作系统紧密相关的,先后顺序是不能人为干预的。
对同一份资源操作时,会存在资源抢夺的问题,需要加入并发控制。
线程会带来额外的开销,如cpu调度的时间,并发控制开销。
每个线程在自己的工作内存交互,内存控制不当会造成数据不一致。

(2)三种创建方式

1.继承Thread类。(重点)
2.实现Runnable接口。(重点)
3.实现Callable接口。(了解)

1.Thread过程:
	(1)自定义线程类继承Tread类
	(2)重写run()方法,编写线程执行体
	(3)创建线程对象,调用start()方法启动线程
	Thread特点:
	(1)子类继承Tread类具备多线程能力
	(2)启动线程:子类对象.start()
	(3)不建议使用:避免OOP单继承局限性
2.Runnable过程:
	(1)定义MyRunnable类实现Runnable接口
	(2)实现run()方法,编写线程执行体
	(3)创建线程对象,调用start()方法启动线程
	Runnable特点:
	(1)定义接口Runnable具备多线程能力
	(2)启动线程:传入目标对象+Thread对象.start()
	(3)推荐使用:避免OOP单继承局限性,灵活方便,方便同一个对象被多个线程使用
3.Callable好处:(1)可以定义返回值(2)可以抛出异常	

(3)静态代理

总结:
	1.真实对象和代理对象都要实现同一个接口。
	2.代理对象要代理真实角色。
好处:
	1.代理对象可以做很多真实对象做不了的事情。
	2.真实对象专注做自己的事情。

(4)Lamda表达式

1.λ希腊字母表中排序第十一位的字母,英语名称为Lamda。
2.优点:
	(1)避免匿名内部类定义过多。
	(2)让代码看起来更简洁。
	(3)去掉没有意义的代码,留下核心的逻辑。
3.实质属于函数式编程的概念。
4.函数式接口(Functional Interface)的定义:任何接口,如果只包含唯一一个抽象方法,那么它就是一个函数式接口。
5.总结:
	(1)lamda表达式只能有一行代码的情况下才能简化成为一行,如果多行,就需要用代码块包裹。
	(2)前提是接口为函数式接口。
	(3)多个参数也可以去掉参数类型,要去掉都去掉,必须加上括号。
a q1=new a() {
    @Override
    public void aa() {
        System.out.print("bb");				
    }    		
};    	
a q1=()-> {
    System.out.print("bb");		
};
q1.aa();

(5)线程生命周期

1.新建: 线程被new出来
2.准备就绪:线程具有执行的资格,即线程调用了start(),没有执行的权利
3.运行:具备执行的资格和具备执行的权利
4.阻塞:没有执行的资格和执行权利
5.销毁: 线程的对象变成垃圾,释放资源。

(6)停止线程

1.不推荐使用jdk提供的stop()、destroy()方法。(已废弃)
2.推荐线程自己停止下来。
3.建议使用一个标志位进行终止变量当flag=false,则终止线程运行。

(7)线程休眠

sleep(时间)指定当前线程阻塞的毫秒数。
sleep存在异常InterruptedException。
sleep时间达到后线程进入就绪状态。
sleep可以模拟网络延时,倒计时等。
每一个对象都有一个锁,sleep不会释放锁。

(8)线程礼让

礼让线程:让当前正在执行的线程暂停,但不阻塞。yield
将线程从运行状态转为就绪状态。
让CPU重新调度,礼让不一定成功!

(9)线程强制执行

join合并线程,待此线程执行完成后,再执行其他线程,其他线程阻塞。(可以想象成插队)
线程状态:Thread.State state=th.getState();

(10)线程优先级

线程调度器按照优先级决定应该调度哪个线程来执行。
线程的优先级用数字表示,范围从1~10。
获取优先级:getPriority()
改变优先级:setPriority(int xxx)

(11)守护线程

线程分为用户线程和守护线程
虚拟机必须确保用户线程执行完毕
虚拟机不用等待守护线程执行完毕
如:后台记录操作日志,监控内存,垃圾回收等
thread.setDaemon(true);

(12)线程同步

为了保证数据在方法中被访问时正确性,在访问时加入锁机制synchronized,当一个线程获得对象的排它锁,独占资源,其他线程必须等待,使用后释放锁即可。
存在的问题:
	1.一个线程持有锁会导致其他所需要此锁的线程挂起。
	2.在多线程竞争下,加锁,释放锁会导致比较多的上下文切换和调度延迟,引起性能问题。
	3.如果一个优先级高的线程等待一个优先级低的线程释放锁,会导致优先级倒置,引起性能问题。

(13)同步方法及同步块

同步方法:public synchronized void method(int args){}
缺陷:若将一个大的方法申明为synchronized将会影响效率
同步块:synchronized(Obj){}
Obj称之为同步监视器
	(1)Obj可以是任何对象,但是推荐使用共享资源作为同步监视器。
	(2)同步方法中无需指定同步监视器,因为同步方法的同步监视器就是this,对象本身,或者class
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值