1.进程和线程的区别?
进程:具有独立功能的程序关于某次数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个独立单位.
线程:是进程的一个实体,是cpu调度和分配的单位,是比进程更小的可以独立运行的单位,
2.线程的几种状态
- 新建(程序还没运行线程中的代码)
- 就绪(当start()方法返回后,线程就处于就绪状态,处于就绪状态的线程并不一定立即运行run()方法,而是和其他线程竞争cpu时间)
- 运行(线程获得cpu时间,进入运行状态,执行run()方法)
- 阻塞(等待wait、带超时的等待sleep)
- 终止(死亡,正常退出或者异常终止)
3.如何创建一个线程?
- 实现Runnable接口,然后将它传递给Thread函数,创建一个Thread对象(可以)
- 直接继承Thread类(受单继承影响,不适合多个线程共享资源)
详解参考:https://www.cnblogs.com/luotaoyeah/p/3854190.html
4.线程的启动
- 线程的启动调用start()方法,是线程所代表的虚拟处理机处于可运行状态,这意味着它可以由jvm调度并执行(并不代表会立即执行)
- run()方法是线程启动后要进行回调(callback)的方法,执行线程
5.线程互斥与同步
互斥(间接相互制约):一个系统中的多个线程必然要共享某种系统资源,如共享 CPU,共享 I/O 设备,所谓间接相
互制约即源于这种资源共享,打印机就是最好的例子,线程 A 在使用打印机时,其它线程都要等待。
同步(直接相互制约):这种制约主要是因为线程之间的合作,如有线程 A 将计算结果提供给线程 B 作进一步处理,那么线程 B 在线程 A 将数据送达之前都将处于阻塞状态。
注意:对于互斥可以这样理解,线程 A 和线程 B 互斥访问某
个资源则它们之间就会产个顺序问题——要么线程 A 等待线程 B 操作完毕,要么线程 B 等待线程操作完毕,这其实就是线程的同步了。因此同步包括互斥,互斥其实是一种特殊的同步。
6.同步和异步的区别?
同步:发送一个请求,等待系统返回后才能发送下一个请求,中间有个等待时间。(当出现多个线程处理共享数据,为了避免一个线程处理的时侯,另一个线程也来处理这个共享数据,造成脏数据的情况,就使用同步的方法,同步就会限制一次只能一个线程来处理,保证共享数据的安全性)
异步:程序不用等待其他请求的返回,随时都可以发送请求。(一般我们写程序时默认使用异步,因为效率高)
区别:同步的效率低,但是安全性高;异步的效率高,但是安全性低。
7.如何实现同步?
- 同步的关键字synchronized
- 可以使用同步代码块;synchronized关键字,括号锁对象(不会锁住整个对象)
- 也可以使用同步方法:在方法权限修饰符后面添加关键synchronized(会锁住整个对象,哪怕这个类中有多个不相关联的同步块,这通常会导致他们停止执行并需要等待获得这个对象上的锁)
8.sleep和wait的区别
- 主要区别:
1.sleep()不会释放锁,其他线程无法进入同步锁,常用于暂停执行.
2.wait()方法会释放锁,当前线程进入线程池,等待其他线程调用 notify方法唤醒线程,常用于线程交互. - 次要区别:
1.sleep()方法必须设置等待时间。wait方法可以设置也可以不设置。
2.sleep()时间到线程就处于临时阻塞或者运行,wait没有时间的话,必 须要等到notify或者notifyAll来唤醒。
3.sleep不一定要定义在同步方法中。wait必须要定义到同步方法中。
9.线程的死锁
死锁:所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。
必要条件:互斥条件,不剥夺条件,请求和保持条件,循环等待条件
例子: