一>>多线程的创建分别:①继承Thread类②实现Runable接口
常用方法有
1.start();启动线程并执行相应的run方法
2.run();子线程要执行 的代码放入run()方法中
3.currentThread();静态的调取当前的线程
4.getname();获取线程名字
5.setname();设置此 线程的名字
6.yield();调用此方法的线程释放当前cpu的执行权
7.join();在A线程中调用B线程 join()方法
8.isalive();判断此线程是否还存活
9.sleep();让当前线程睡眠多少毫秒
二>>对比一下继承的方式和实现的方式
实现的方式优于继承
1.实现的方式避免了单继承的局限性
2.如果多个线程要操作同一份资源(或数据)更适合用实现的方式 同时共享数据所在的类可以作为Runable接口的实现类
三>>线程安全问题出现的原因
由于一个线程在操作共享数据过程中未执行完毕的情况下,另外的线程参与进来,导致共享数据存在安全问题。
四>>如何解决线程安全问题
必须让一个线程操作共享数据完毕后其他线程才有机会参与共享的操作
五>>java如何实现线程的安全>线程的同步机制
方式一:同步代码块
synchronized(同步监视器){
需要被同步的代码块(即为操作共享数据的代码)
}
1.共享数据:多个线程共同操作的同一个数据量(变量)
2.同步监视器:由一个类对象来充当, 哪个线程获取监视器谁就执行大括号里被同步的代码,俗称锁 。要求所有的线程必须公用同一把锁。
注意:在实现的方式中,考虑同步问题的话可以使用this。但是在继承的方式中慎用this
方式二:同步方法
将操作共享数据的方法声明为synchronized既此方法认为同步方法
能够保证当其中一个线程执行此方法时其他线程在外等候直至此线程执行完此方法。
同步方法的锁:this(既当前对象)
对于静态方法如果使用同步默认的锁为当前类本身,以单列的懒汉式为例(singleton.class)
六>>线程同步的弊端
由于同一个时间只能有一个线程访问共享数据效率变低了。
七>>线程通信
三个关键词:wait():一旦一个线程执行到wait(),就释放当前的锁
notify(),notifyall();唤醒wait()的一个或所有的线程
线程通信必须在同步代码块中 ,wait等待,notify解除。