Java多线程
一.多线程的概念
1.进程与线程
(1).进程
每个独立执行的程序可以称为一个进程
(2).线程
在一个进程中还可以有多个执行单元同时运行,这些执行单元可以看做程序执行的一条条线索
每一个程序至少存在一个线程,
二.多线程的创建
1.继承Thread类
步骤:
(1)继承Thread类重写Thread类中的run方法,
(2)在main中创建继承了Thread的类的实例对象,并调用start方法,一个实例对象为一个线程
2.实现Runnable接口
继承只能是单继承一般继承了别的类就不能再用Thread多线程了
步骤:
(1)实现Runnable接口,重写run方法
(2)创建实现Runnable接口类的实例对象
(3)创建Thread对象,并把上一步创建的实例对象通过构造方法传入,并调用start方法开始一个线程
3.两种方式的异与同
同:创建多线程都需要Thread类的实例对象调用start方法,且一个对象只能创建一个线程
都需要重写run方法。currentThread()可获取当前线程对象getName()获取线程的名称
异:继承Thread如果资源是共享的可能无法实现资源的同步,而实现Runnable接口则可以
实现Runnable接口比继承Thread类的好处有:
适合多继承的情况且适合对个相同程序代码的程序去处理同一资源的情况
4.后台线程
当main()方法创建完线程并执行完代码后main线程就会结束,但java程序并不会就此结束,只有当前台线程全部执行
完后java程序才会结束,如过一个程序只有后台线程进程就会结束,新创建的线程默认为前台线程,只有在启动前调用
setDaemon(true)语句就会变成后台线程
三.多线程的生命周期及状态转换
1.全部状态

(1)新建状态
刚创建完一个线程对象,还没有调用start方法
(2)就绪状态
调用start方法后,处于可运行池中,等待系统调度
(3)运行转态
处于2状态的线程获取cpu的使用权开始执行run方法,当时用完系统分配的时间后就会剥夺该线程的占用的
cpu资源让其他线程获得执行的机会,此时线程会转入就绪状态
(4)阻塞状态
线程在某些特殊情况下,进入阻塞状态,改状态下,只有当引起阻塞的原因被消除后,线程才可转入就绪状态
引起阻塞的原因:
有同步锁,该锁被其他线程所持有
调用了一个阻塞式的I/O方法时
调用了某个对象的wait方法,想转入就绪状态必须用notify唤醒
调用了Thread的sellp(long millis)方法时
调用了另一个线程的join方法,需要等到新加入的线程运行才行
(5)死亡状态
run方法执行完毕或或抛出一个未知的异常、错误
四.线程的调度
调度模式:分时调度和抢占式调度(默认)
1.线程的优先级
https://www.cnblogs.com/xiaoxi/p/7133002.html?utm_source=itdadao&utm_medium=referral
2.线程的休眠
调用Thread的静态方法sleep(休眠时间毫秒)让正在执行的线程暂停,将CPU让给别的线程,
3.线程让步
调用Thread的静态方法yield让线程暂停,并转换为就绪状态,sleep是让线程进入阻塞状态
4.线程插队
在某某个线程对象内调用join方法,该线程会进入阻塞状态,直到调用join方法的线程加入并执行完毕
五.线程的安全和和同步
1.线程的安全
概念:如在一个车站有三个买票窗口,他们共同卖一定数额的票,必须保证同一张票只能被一个窗口卖出,并且卖出的票得存在这就是线程安全
2.同步代码块
概念:想要保证线程安全,必须得保证处理共享资源的代码在任何时刻只能有一个线程访问
实现:用synchronized关键字修饰处理共享资源的代码块,我们称之为同步代码块,也可称为同步锁
格式:synchronizwd(任意类型对象,每个线程共用的,相当于唯一一把钥匙){要同步的代码}
3.同步方法
用synchronized修饰的方法
4.死锁问题
概念:小明有一个苹果,小红有一个橘子,小明需要橘子,小红需要苹果,但他们两个谁也不肯先给,
相当于两个线程互相握着对方需要的资源,谁也不肯先给,从而导致两个线程阻塞
六.多线程通信
https://www.cnblogs.com/qifengshi/p/6288297.html
本文来自博客园,作者:你好鸭©,转载请注明原文链接:https://www.cnblogs.com/chanfa/p/9406187.html

浙公网安备 33010602011771号