Java_总结十二(多线程)
一、进程
操作系统中的一个软件,是操作系统分配内存的最基本的单位
二、线程
--进程中的一条执行路径
--线程的生命周期包括五个状态:新生状态、可运行状态、运行状态、阻塞状态和死亡状态
三、多线程
进程中同时执行着多个路径
多线程的好处:
①提高执行效率
②可以提高资源的利用率
多线程执行特性:
--随机性(异步执行) 谁抢到cpu
--宏观意义上讲: 多线程就是在同一时刻执行多个线程
--微观意义上讲: cpu同一时间只能执行一个线程,多核除外
四、多线实现分类
①没有共享资源, 相同操作
--类继承Thread
②共享资源,相同操作
--资源类实现Runnable接口
--只会创建一个资源类对象
--多个线程共享一份资源
③共享资源 不同操作
--创建资源类
--创建不同操作类 实现 Runnable 接口
--创建操作类 并且把资源类对象传递进去
--创建线程并且启动
/* * 需求:你有一张银行卡,卡有余额0,你往银行卡存钱,你女朋友取钱,请编写程序模拟过程 分析 1存在资源共享 2一个人存钱,一个人取钱(操作不同) */ public class Test01 { public static void main(String[] args) { BankCard card = new BankCard(); GetMoney gm = new GetMoney(card); SetMoney sm = new SetMoney(card); Thread t1 = new Thread(sm); Thread t2 = new Thread(gm); t1.start(); t2.start(); } } //银行卡 class BankCard { private double money=0; public double getMoney() { return money; } public void setMoney(double money) { this.money = money; } } /** * 存钱 */ class SetMoney implements Runnable{ BankCard card; public SetMoney(BankCard card) { this.card = card; } @Override public void run() { for (int i = 0; i < 10; i++) { card.setMoney(card.getMoney()+1000); System.out.println(Thread.currentThread().getName()+"存 1000,剩余 "+card.getMoney()); } } } /** * 取钱 */ class GetMoney implements Runnable{ BankCard card; public GetMoney(BankCard card) { this.card = card; } @Override public void run() { for (int i = 0; i < 10; i++) { card.setMoney(card.getMoney()-1000); System.out.println(Thread.currentThread().getName()+"取1000,剩余 "+card.getMoney()); } } }
执行结果:
Thread-1取1000,剩余 0.0 Thread-1取1000,剩余 -1000.0 Thread-1取1000,剩余 -2000.0 Thread-1取1000,剩余 -3000.0 Thread-1取1000,剩余 -4000.0 Thread-1取1000,剩余 -5000.0 Thread-1取1000,剩余 -6000.0 Thread-1取1000,剩余 -7000.0 Thread-1取1000,剩余 -8000.0 Thread-1取1000,剩余 -9000.0 Thread-0存 1000,剩余 1000.0 Thread-0存 1000,剩余 -8000.0 Thread-0存 1000,剩余 -7000.0 Thread-0存 1000,剩余 -6000.0 Thread-0存 1000,剩余 -5000.0 Thread-0存 1000,剩余 -4000.0 Thread-0存 1000,剩余 -3000.0 Thread-0存 1000,剩余 -2000.0 Thread-0存 1000,剩余 -1000.0 Thread-0存 1000,剩余 0.0
五、Thread类中的方法
①start和run的区别
--start() 会创建新的栈空间,会产生新的子线程(工作线程)
--run()调用线程对象中的run方法,不会产生新的线程,是在主线程中执行的
②join、sleep、yield、setPriority()
--Join() 插入/合并,插入到当前线程的前面,在哪个线程调用就阻塞的哪个线程
--sleep() 当前线程睡眠进入到阻塞状态,释放cpu资源,其他的线程均可抢占cpu资源
--yield() 当前线程进入到可执行状态,释放了cpu资源,自己和自己优先级相同或者更高的线程可以抢占cpu资源
--setPriority() 设置线程优先级,优先级高的尽可能多去抢占cpu源 (可能不准),级别1-10,1位低,10为高
--Thread.currentThread().setName()设置线程的名字
在线程类中,可以通过构造方法调用父类Thread的setName()--------super.setName();
--Thread.currentThread().getName() 获取线程的名字
六、终止线程的方式
①通过标志位 能够将run方法执行完毕
注意:这里没截图完整,标志位的注释也要打开
②stop() 不推荐使用,run方法可能不能完全执行完毕
③interrupt () 通过抛出异常的方式来终止的