java多线程

多线程编程:
多任务处理有两种类型:
基于进程
基于线程

进程是指一种“自包容”的运行程序,有自己的地址空间;线程是进程内部单一的一个顺序控制流
基于进程的特点是允许计算机同时运行两个或多个程序
基于线程的多任务处理环境中,线程是最小的处理单位

多任务
多进程:
1、进程是一个独立的应用程序
2、独占内存空间
3、不是绝对意义的同时运行,而是CPU在进程间来回的切换
线程:
1、是进程内部独立运行流程
2、一个进程里面的线程是共享内存地址空间
3、不是绝对意义的同时运行,而是CPU在线程间来回的切换(线程所需的开销更少,效率比进程之间切换消耗小,效率高)


实现方式1:
继承Thread类:并覆盖run()方法,相当于线程的main方法,调用start方法才是开启线程
实现方式2:
实现Runnable接口:并实现run()方法,把接口实现类对象交给一个线程对象,然后调用线程对象的start()方法
new一个Thread类把实现了Runnable的类传进去
Thread类start();
1、分配空间
2、开启线程
3、判断是否有实现Runnable接口,如果有调用传入的类的run();如果没有调用自己的run();

线程状态:
5种状态:
1、新建状态:new出Thread对象的时候。
2、就绪状态:调用start()方法,但是在start()方法调用run()方法之前的状态(分配空间、开启线程)。
3、运行状态:开始执行run()方法。
4、死亡状态:当run()方法执行完了(回收资源、关闭线程)
5、运行状态过程中进入中断状态:
造成中断的5种原因:
1、线程优先级的原因(线程没有抢到CPU执行)
优先级: 最大MAX_PRIORITY 10
最小MIN_PRIORITY  1
默认NORM_PRIORITY 5
设置优先级:Thread对象.setPriority(); 对应的get是得到线程的优先级。
优先级高并不是一定被执行完了在执行低的(不一定争夺赢),只是它被CPU执行的几率更高
2、阻塞:
等待一个I/O操作的时候
3、休眠:
Thread对象.sleep(毫秒);
4、等待/唤醒:
当多个线程在争夺CPU的时候某个线程可以主动wait()退出争夺,然后等待另一个线程调用notify()将第一个调用wait()的线程唤醒
notufyAll()是将全部调用wait()的线程唤醒
5、挂起
yield();
强行让一个线程退出CPU的争夺

线程安全:
当多个线程访问同一资源的时候,才会考虑发生线程安全性问题
解决方法:加同步锁
一个线程执行完了,才允许另一个线程进入操作,线程安全,效率低
同步方法:synchronized 同步锁加在资源方法
同步块:在资源的方法不加synchronized修饰,加在run方法内加synchronized(资源对象){资源对象.方法}(适用于资源对象内有多个方法需要同步)
死锁:
当两个或多个线程,同步访问一对相互(循环)依赖的资源的时候,有可能会发生死锁现象。

线程间的通信:wait() - notify() - notifyAll();
只能够写在同步方法或者同步块当中
守护线程:
只有在主线程执行后才会执行, 不会跟主线程抢CPU,主线程结束,守护线程也跟着结束

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值