一、
1、多线程概述
什么是多线程?
一个应用程序有多条执行路径,线程是依赖于进程而存在的。
------------------------------------
二、多线程的实现方式一
1、创建多线程的方式一?
A创建一个类这个类继承Thread类
B重写run方法
C启动线程并执行
stat()方法做了几件事?
启动线程,自动调用run方法
线程越多越好吗?
不是,因为没开一个线程系统必然会为它分配内存。
Thread类下setName,getName方法的作用?
setName()为线程命名
getName()获取线程的名称
-------------------------------------------
三、线程执行的随机性
1、为什么会出现线程执行的随机性?
因为在某个时间点CPU只会执行一个线程。
----------------------------------------------
四、多线程的实现方式二
1、实现多线程的方式二
A创建一个类去实现Runnable接口
B重写run方法
C创建MyRunnable对象mr
D把对象mr作为参数传递到Thread类的构造方法中,得到了Thread对象。
注意事项:
第二种方式可以直接调用getName()方法可以获取当前线程的名字吗?
不能不能直接调用,但是可以间接调用
----------------------------------------------------
五、有了Thread类为什么还要有实现Runnable接口
1、避免了单继承的局限性
2、只创建了一个资源对象节省空间,更好的实现了数据操作分离。
--------------------------------------------------------
六、线程的生命周期
1、线程的状态有
新建:创建一个线程对象
就绪:具备执行资格,不具备执行权
可能出现阻塞状态:都不具备
运行:都具备
死亡:线程对象变成垃圾,等待垃圾回收器回收
-----------------------------------------------------
十、十一、用实现Runnable接口的方式模拟卖票出现了,重复和负数的情况,及解决方法
1、出现重复和负数的产生原因:
因为线程随机性和延迟性
2、同步关键字是?
synchronized
3、如何解决重复和负数的情况:
加锁
4、多线程程序出问题的判断条件?
1、看是否有共享数据
2、看共享数据是否被多条语句操作
3、是否在多线程程序中
----------------------------------------------------
十二、 测试不同同步机制的锁对象
什么是同步代码块、同步方法:
同步代码块就是把锁加在方法中
同步方法其实就是把锁加在方法声明上
同步代码块和同步方法的锁对象是谁:
同步代码块:任意对象(这里不要用匿名对象)
同步方法的锁对象是谁this
静态的同步方法锁对象是该类的字节码文件对象
什么时候考虑用同步代码块的方式锁呢?
当方法中不是所有代码都需要加锁的时候
什么时候考虑用同步方法的方式锁呢?
当方法中所有的代码都需要加锁的时候。
---------------------------------------------------
十五、解决学生模拟出现的安全问题
-----------------------------------
十六、通过等待唤醒机制让数据依次出现
Object类中 wait()
让线程等待,调用它的对象是锁对象
Object类中 notify()
唤醒线程,调用它的对象是锁对象
---------------------------------------------------------
十七、等待唤醒机制的代码分析
回顾sleep方法和wait方法的区别?
sleep Thread类中 不释放锁对象 只能等时间
wait Object类中 释放锁对象 它可以被唤醒
-------------------------------------------------------
十九、线程优先级
thread类下的public final int getPriority()
获取线程的优先级
thread类下的public final void setPriority(int newPriority)
设置线程的优先级
线程的默认优先级是(5),范围是1-10;
注意:线程优先级越大不代表它一定能先执行,也不代表它一定能先执行完
--------------------------------------------------------------
二十、暂停线程
1、thread类下的public static void yield()
暂停当前线程执行其他线程
2、yield()方法的作用或者用法?
让线程可以稍微的和谐一些,但是不能依赖它保证让数据依次出现
要想保证还得依靠等待唤醒机制。
-------------------------------------------------------------
二十一、加入线程
1、thread类下 public final void join()
哪个线程对象调用该方法,其他线程必须等待该线程执行完毕才能执行。
注意事项:
哪个线程对象想要作为加入线程,必须先启动该线程。
------------------------------------------------------------
二十二、守护线程
Thread类下的public final void setDaemon(boolean on)
将该线程设置为守护线程
1、熟练掌握多线程实现的 方式一 方式二
2、自己分组互相讲一下多线程的生命周期
3、自己把上课敲的重点知识回顾一遍。
4、回顾Xmind
5、用方式二模拟多线程卖票,要求卖票的时候不能有相同的票,和负数。
6、面试题:请写出一个死锁的代码。
7、用多线程模拟学生类数据通讯(数据要依次出现)
8、针对有7的代码进行改进优化。
9、把19-22中讲的方法自己测试一遍。
|
|