多线程: 多条执行单元
进程:正在运行的应用程序
线程:进程的执行单元,一条执行路径
迅雷下载,360清理
多线程程序实现:
线程依赖于进程存在,Thread类
子类继承
子类重写run方法
调用strart(),让线程启动,调用run()方法
同一个线程对象连续两次启动,报错:表示该线程状态有问题
getName()方法:标志不同线程,获取线程名称
setName():更改线程名字
线程随机性:
程序执行,抢占CPU资源,CPU在多个程序间切换。
第二种实现:
创建类,实现Runnable接口
重写run方法
创建类的实例
把类的实现作为Thread的构造参数,创建Thread对象引用
Thread.currentThread().getName()
优势:
避免了单继承的局限性;
实现接口的方式只创建一次,更好的实现了数据与操作的分离。
买票代码:
A:共享数据;两种方式;
B:卖出负数,卖出相同票--解决问题方式
【线程的随机性和延迟性】
找问题出处:
A:看有没有共享数据;
B:看共享数据的操作是不是多条语句;
C:看是不是在多线程程序中
解决:把满足条件的代码锁在一起 synchronized
锁对象:同步代码块的锁是任意对象
同步方法:把锁就在方法上---线程安全问题
this对象
静态方法:类名.class Class【字节码文件】类型的对象
死锁
被同步的代码越少越好,建议使用同步代码块
若一个方法全部被同步了,就用同步方法
线程间的通信:
学生信息录入与输出:多线程随机性
录入一个,输出一个---同一个
学生 信息录入 信息获取 集中测试类