1.多线程的实现有几种方式?实现步骤分别是怎样的?
有两种方式,分别为通过继承Thread类和实现Runnable接口;
(1)通过继承Thread类的实现步骤分为:
a.定义Thread的子类,并且重写run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把run()方法称为线程执行体;
b.创建Thread子类对象,也就是线程对象;
c.通过调用线程对象的start()方法来开启子线程,执行run()中的方法体.
(2)通过实现Runnable接口的实现步骤分为:
a. 定义Runnable接口的实现类,并重写该类的run()方法,该run()方法的方法体就代表了线程需要完成的任务,因此把run()方法称为线程执行体;
b.创建Runnable实现类的实例,并以此以此实例作为Thread的target来创建Thread对象,该Thread对象才是真正的线程对象;
c.调用线程对象的start()方法来启动线程.
2.继承Thread类和实现Runnable接口有啥区别?实现Runnable接口的优势体现在哪里?
a.使用继承的方式,占用继承位;使用实现的方式,不占用继承位置,而是占用一个接口位置;
b.使用继承的方式,耦合度太高,两个功能写在一起;使用实现的方式,两个功能拆开,解耦合;
c.使用继承的方式,不能实现资源共享;使用实现的方式,可以实现资源共享;
3.线程安全问题时怎么产生的?如何解决线程安全问题,有哪几种方式?
当多个线程共享同一个资源,并对这个资源中的数据执行写操作,就会产生线程安全问题,出现不该出现的数据,或是一个数据被同时使用,造成错误.
解决线程安全问题,有三种方式:
a.使用同步代码块,格式为synchronized(同步锁){需要操作的代码} 多个线程要想实现同步技术,必须使用同一个锁对象,锁对象可以是任意对象;
原理是拿到锁的线程不执行完不会释放锁,没有锁的线程进不来
b.使用同步方法 格式为public synchronized void method(){可能会产生线程安全问题的代码} 注意:静态同步方法使用的锁对象是类名.class
c.使用Lock解决,格式为Lock lock = new ReentrantLock(); public void lock();加同步锁{需要加同步的代码} public void unlock();
释放同步锁;一般会在finally中释放锁,保证资源不被浪费;
4.sleep()方法和wait()方法的区别?
对于sleep()方法,我们首先要知道该方法是属于Thread类中的。而wait()方法,则是属于Object类中的。
sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。
在调用sleep()方法的过程中,线程不会释放对象锁。
而当调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象调用notify()方法后本线程才进入对象锁定池准备
获取对象锁进入运行状态。
|