1.多线程的实现有几种方式?实现步骤分别是怎样的?
两种方式:
1.创建子类继承Thread类,重写run方法,通过子类对象调用.start()启用新线程; 2.通过子实现类实现Runnable接口,通过Runnable接口的实现类对象作为Thread的target来创建Thread对象。 通过Thread对象调用start()方法启动新线程。
2.继承Thread类和实现Runnable接口有啥区别?实现Runnable接口的优势体现在哪里?
1.实现Runnable接口避免了单继承的局限性 。类继承了Thread类就不能再继承其他类,实现Runnable接口还可以继承其他类,实现其他接口。
2.增强了程序的扩展性,降低了程序的耦合性(解耦)。 实现Runnable接口的方式,把设置线程任务和开启新线程进行了分离(解耦)
3.线程安全问题时怎么产生的?如何解决线程安全问题,有哪几种方式?
当我们使用多个线程访问同一资源的时候,且多个线程中对资源有写的操作,就容易出现线程安全问题。
实现线程安全问题的方法有三种:
1.使用同步代码块
2.使用同步方法
3.lock锁机制
4.sleep()方法和wait()方法的区别?
sleep()可以设置睡眠时间,不能主动释放锁;
wait()除非被唤醒否则无限等待,可以主动释放锁;
5.线程有几种状态?他们之间是如何转化的?
六种状态:
NEW(新建)、Runnable(可运行)、Blocked(锁阻塞)、Waiting(无限等待)、TimedWaiting(计时等待)、Teminated(被终止)
(1)新建一个线程对象处于可运行状态,如果它抢到了锁对象,就可以运行,如果没抢到就会进入阻塞状态,
(2)当线程抢到锁,通过sleep方法进入TimedWaiting状态,sleep时间结束后进入可运行状态,如果是Wait方法结束那么就需要重新去抢锁,如果抢到就进入可运行状态
没抢到就进入阻塞状态。
(3)当线程抢到锁,通过wait()方法进入无线等待状态,如果被其他线程就需要等待其他线程的唤醒,当其他线程唤醒它时,就需要去抢夺锁,抢到就运行,没抢到进入阻塞
状态。
(4)线程任务运行完线程就被终止。
|