1.多线程的实现有几种方式?实现步骤分别是怎样的?
继承Thread 实现Runnable
继承Thread类
方式一 创建一个 自定义类 继承 Thread 自定义类 就是一个线程对象
在该自定义类中 重写了run方法 说明该自定义类 也定义好了 线程任务
使用自定义类对象 调用start方法 开启了新的线程
为什么不直接使用Thread类 开启线程 非要继承后重写run方法呢?
new Thread().start();//是开启新的线程 但是 没有执行代码 没有意义
查看 Thread中 run方法源码
public void run() {
if (target != null) {
target.run();
}
}
方式二 实现Runnable接口
创建了一个自定义类 实现 Runnable接口 只定义了run()方法 说明该自定义类 就是一个线程(目标)任务类
创建一个线程对象 将 自定义类对象 作为参数传递 new Thread(线程执行目标);
2.继承Thread类和实现Runnable接口有啥区别?实现Runnable接口的优势体现在哪里?
如果一个类 继承Thread 不适合资源共享
如果实现了 Runnable接口 可以实现资源共享
3.线程安全问题时怎么产生的?如何解决线程安全问题,有哪几种方式?
1:多线程程序
2:多个线程使用同一资源
3:多个线程对资源有写的操作
造成了 数据不同步
加锁解决 同步机制
4.sleep()方法和wait()方法的区别?
sleep()方法正在执行的线程主动让出CPU(然后CPU就可以去执行其他任务),在sleep指定时间后CPU再回到该线程继续往下执行(注意:sleep方法只让出了CPU,而并不会释放同步资源锁!!!);wait()方法则是指当前线程让自己暂时退让出同步资源锁,以便其他正在等待该资源的线程得到该资源进而运行,只有调用了notify()方法,之前调用wait()的线程才会解除wait状态,可以去参与竞争同步资源锁,进而得到执行
5.线程有几种状态?他们之间是如何转化的?
NEW
至今尚未启动的线程处于这种状态。
新建状态 创建了线程对象 但是还没有调用strat()方法
RUNNABLE
正在 Java 虚拟机中执行的线程处于这种状态。
正在执行的代码,可能分配到了CPU时间片,也可能没分配到,有系统决定。
BLOCKED
受阻塞并等待某个监视器锁的线程处于这种状态。
线程A与线程B使用同一把锁,如果线程A拿到了锁,那么线程B就进入了锁阻塞状态
WAITING
无限期地等待另一个线程来执行某一特定操作的线程处于这种状态。
一定是在有同步锁对象的时候,调用可wait等不传递时间参数的方法,进入无限等待
只能依靠另一个同步线程完成唤醒。
TIMED_WAITING
等待另一个线程来执行取决于指定等待时间的操作的线程处于这种状态。
两种情况
1:sleep 进入“休眠” 等待时间到了就结束,在等待时间内的状态就是计时等待状态。
2:一定是在有同步锁对象的时候,调用可wait等传递时间参数的方法,进入计时等待
如果在这段时间内 另一个同步线程完成唤醒,那么就唤醒。否则那么就等到这段时间结束 就醒了
进入等待 醒之前时间内的状态就是计时等待
TERMINATED
已退出的线程处于这种状态。
终止状态
线程run方法执行完毕 或者遇到未知问题结束的时候
在给定时间点上,一个线程只能处于一种状态。这些状态是虚拟机状态,它们并没有反映所有操作系统线程状态。
|