文章目录
1、并行和并发有什么区别?
- 并行在操作系统中是指,一组程序按独立异步的速度执行,不等于时间上的重叠(同一个时刻发生)
- 并发是指:在同一个时间段内,两个或多个程序执行,有时间上的重叠(宏观上是同时,微观上仍是顺序执行)
区别:
- 并发是指一个处理器同时处理多个任务。并行是指多个处理器或者是多核的处理器同时处理多个不同的任务
- 并行(parallel):指在同一时刻,有多条指令在多个处理器上同时执行。并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行
2、线程和进程的区别
- 定义:进程是指执行中的一段程序,线程是单个进程中执行的每个任务
- 一个线程只能属于一个进程,但是一个进程可以拥有多个线程。多线程处理就是允许一个进程中在同一时刻执行多个任务
3、创建线程的方式
- 继承Thread类创建线程
- 实现Runnable接口创建线程
4、sleep和wait区别(重点)
- sleep是线程中的方法,但是wait是Object中的方法
- sleep方法是不会释放 lock,但是wait会释放,而且会加入到等待队列中
- sleep方法不依赖于同步器synchronized,但是wait需要依赖于synchronized
- sleep不需要被唤醒(休眠之后推出阻塞),但是wait需要(不指定时间需要被别人中断)
5、Java线程的生命周期
线程是一个动态执行的过程,从产生到死亡共有5种状态
新建 – 就绪 – 运行 – 堵塞 – 死亡
新建(new Thread)
当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)
例如:Thread t1=new Thread();
就绪(runnable)yield是进入就绪状态
线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到CPU资源。例如:t1.start();
运行(running)
线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。
死亡(dead)
当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。
-
自然终止:正常运行run()方法后终止
-
异常终止:调用stop()方法让一个线程终止运行
堵塞(blocked)
-
由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。
-
正在睡眠:用sleep(long t) 方法可使线程进入睡眠方式。一个睡眠着的线程在指定的时间过去可进入就绪状态。
-
正在等待:调用wait()方法。(调用motify()方法回到就绪状态)
-
被另一个线程所阻塞:调用suspend()方法。(调用resume()方法恢复)
-
6、在多线程编程里,wait方法的调用方式实怎样的?
wait方法是线程通信的方法之一,必须用在synchronized方法或者synchronized代码块中,否则会抛出异常。所以wait方法必须使用上锁的对象来调用,从而持有该对象的锁进入线程等待状态,直到使用该上锁的对象调用notify或者notifyAll方法来唤醒之前进入等待的线程,已释放持有的锁
7、Error 和 Exception 区别是什么?
- Error 类型的错误通常为虚拟机相关错误,如系统崩溃,内存不足,堆栈溢出等,编译器不会对这类错误进行检测,JAVA 应用程序也不应对这类错误进行捕获,一旦这类错误发生,通常应用程序会被终止,仅靠应用程序本身无法恢复;
- Exception 类的错误是可以在应用程序中进行捕获并处理的,通常遇到这种错误,应对其进行处理,使应用程序可以继续正常运行。
8、常见的RuntimeException有哪些?
- ClassCastException(类转换异常)
- IndexOutOfBoundsExcepton(数组越界)
- NullPointerException(空指针)
- 还有IO操作的BufferOverflowException异常
- ArrayStoreException(数据存储异常,操作数组时类型不一致)