一、多线程
1.1什么是线程?线程和进程的区别?
线程:是进程的一个实体,是cpu调度和分派的基本单位,是比进程更小的可以独立运行的基本单位。
进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,是操作系统进行资源分配和调度的一个独立单位。
特点:线程的划分尺度小于进程,这使多线程程序拥有高并发性,进程在运行时各自内存单元互相独立,线程之间,内存共享,这使多线程编程可以拥有更好的性能和用户体验。
1.2创建线程有几种方式?
1)继承Thread类并重写run方法创建线程,实现简单但不可以继承其他类
2)实现Runnable接口并重写run方法。避免了单继承局限性,编程更加灵活,实现解耦
3)实现Callable接口并重写call方法,创建线程。可以获取线程执行结果的返回值,并且可以抛出异常。
4)使用线程池创建(使用 java.util.concurrent.Executor 接口)
1.3 Runnable和Callable的区别?
1)Runnable接口run方法无返回值;Callable接口call方法有返回值,支持泛型
2)Runnable接口run方法只能抛出运行时异常,且无法捕获处理;Callable接口call方法允许抛出异常,可以获取异常信息。
1.4 如何启动一个新线程、调用start和run方法的区别?
1)线程对象调用run方法不开启线程,仅是调用调用方法。
2)线程对象调用start开启线程,并让jvm调用run方法在开启的线程中执行
3)调用start方法可以启动线程,并且使得线程进入就绪状态,而run方法只是thread的一个普通方法,还是在主线程中执行。
1.5 线程有哪几种状态以及各种状态之间的转换?
1)第一种是new-》新建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态
2)第二种是Runnable-》就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程调度程序还没有把该线程设置为当前线程,此时处于就绪状态。
3)第三是Running-》运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数中的代码,
4)第四是阻塞状态。阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态。阻塞的情况分三种:
a.等待:通过调用线程的wait()方法,让线程等待谋工作的完成。
b.超时等待:通过调用线程的sleep()或join()或发出I/O请求时,线程会进入阻塞状态。当sleep()状态超时、join()等待线程终止或超时、或者I/O处理完毕时,线程重新转入就绪状态。
c.同步阻塞:线程在获取syncjronized同步锁失败(因为锁被其他线程所占用),它会进入同步阻塞状态。
5)第五是dead-》死亡状态。线程执行完了或者因异常退出了run()方法,该线程结束生命周期。
1.6线程唤醒(notify)
Object类中的notify()方法 ,唤醒在此对象监视器上等待的单个线程。如果所有线程都在此对象上等待,则会选择唤醒其中一个线程,选择是任意的,并在对实现做出决定时发生,线程通过调用其中一个 wait() 方法,在对象的监视器上等待,直到当前的线程放弃此对象上的锁定,才能继续执行被唤醒的线程,被唤醒的线程将以常规方式与在该对象上主动同步的其他所有线程进行竞争。类似的方法还有 notifyAll() ,唤醒再次监视器上等待的所有线程。
1.7 wait()和 sleep()的区别?
来自不同的类
wait():来自 Object 类; sleep():来自 Thread 类;
关于锁的释放:
wait():在等待的过程中会释放锁; sleep():在等待的过程中不会释放锁 3.使用的范围:
wait():必须在同步代码块中使用; sleep():可以在任何地方使用;
是否需要捕获异常 wait():不需要捕获异常; sleep():需要捕获异常;
wait():不需要捕获异常;
sleep():需要捕获异常;
标签:调用,run,重难点,线程,超强,sleep,多线程,方法,wait From: https://www.cnblogs.com/linwenguan/p/16926737.html