吴香斌
1.多线程的实现有几种方式?实现步骤分别是怎样的?
两种方式:
方式一:1. 创建一个自定义类继承Thread类 2. 重写Thread类的run方法 3. 创建自定义类对象,并调用start方法,便启动了一个新的线程. 方式二: 1. 创建一个自定义类实现Runnable接口 2. 重写Thread类的run方法 3. 创建自定义类对象,并把自定义对象作为Thread类构造方法的参数,创建Thread对象. 4. 使用Thread对象调用start方法,便启动了一个新的线程
2.继承Thread类和实现Runnable接口有啥区别?实现Runnable接口的优势体现在哪里?
实现Runnable接口是先创建Runnable接口实现类对象,然后把接口对象作为Thread类构造方法的参数,创建Thread对象,接下来步骤和直接继承Thread类方法一样.
实现Runnable接口的优势:
1. 适合多个相同的程序代码的线程实现资源共享
2. 避免Java中的单继承的局限性
3. 增加程序的健壮性,实现解耦操作
4. 线程池只能放入实现Runnable或Callable类线程,不能直接放入继承Thread的类
3.线程安全问题时怎么产生的?如何解决线程安全问题,有哪几种方式?
主要是针对全局变量和静态变量而言,在多线程程序中,多个线程使用同一资源,可能存在改写的操作,容易造成数据的不同步
三种方式; 1. 同步代码块 2. 同步方法 3. 同步锁机制
4.sleep()方法和wait()方法的区别?
sleep方法是提供时间参数的暂停方法,在时间达到或者被提前释放,线程都会被唤醒.
wait()方法分为体提供时间参数和不提供时间参数的暂停方法,前者和sleep是一样的,或者若没有被提前释放,则会无限期暂停下去.
5.线程有几种状态?他们之间是如何转化的?
线程有6种状态.
1. New状态 ---->(调用start方法) Runnable运行状态
2. Runnable状态 --->(运行结束) Teminated停止状态
Runnable状态 --->(未获取到锁) Block锁阻塞
Runnable状态 --->(无时间参数的wait方法) Waiting无限等待
Runnable状态 --->(有时间参数的wait方法/sleep方法) Timed Waiting计时等待
3. Block锁阻塞 --->(获取到锁) Runnable运行状态
4. Waiting无限等待 --->(被唤醒未获得锁) Block锁阻塞
Waiting无限等待 --->(被唤醒且获得锁) Block锁阻塞
5. TimeWaiting及时等待 --->(计时等待时间到/被唤醒 ,且获得锁) Runnable状态
TimeWaiting及时等待 --->(计时等待时间到/被唤醒 ,但未获得锁) Runnable状态
|