1、线程 ,与进程的区别以及为什么使用多线程?
线程是指程序在执行过程中,能够执行程序代码的一个执行单元。线程有四种状态:运行,就绪,挂起和结束。
进程是指一段正在执行的程序。一个进程拥有多个线程,各个线程之间共享程序的内存空间(代码段、数据段和堆空间)及一些进程级的资源(例如打开的文件),但是各个线程拥有自己的栈空间。
1、调度:在传统的操作系统中,CPU调度和分派的基本单位是进程。而在引入线程的操作系统中,则把线程作为CPU调度和分派的基本单位,进程则作为资源拥有的基本单位。
2、并发性:在引入线程的操作系统中,不仅进程之间可以并发执行,而且在一个进程中的多个线程之间也可以并发执行,因而使操作系统具有更好的并发性,从而更有效地提高系统资源和系统的吞吐量。
3、拥有资源:不论是引入了线程的操作系统,还是传统的操作系统,进程都是拥有系统资源的一个独立单位,他可以拥有自己的资源。
4、独立性:在同一进程中的不同线程之间的独立性要比不同进程之间的独立性低得多。这是因为为了防止进程之间彼此干扰和破坏,每个进程都拥有一个独立的地址空间和其它资源,除了共享全局变量外,不允许其它进程的访问。但是同一进程中的不同线程往往是为了提高并发性以及进行相互之间的合作而创建的,它们共享进程的内存地址空间和资源,如每个线程都可以访问它们所属进程地址空间中的所有地址,如一个线程的堆栈可以被其它线程读、写,甚至完全清除。
5、系统开销: 由于在创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O设备等。因此,操作系统为此所付出的开销将显著地大于在创建或撤消线程时的开销。在进程切换时,涉及到整个当前进程CPU环境的保存环境的设置以及新被调度运行的CPU环境的设置,而线程切换只需保存和设置少量的寄存器的内容,并不涉及存储器管理方面的操作。
6、支持多处理机系统:在多处理机系统中,对于传统的进程,即单线程进程,不管有多少处理机,该进程只能运行在一个处理机上。但对于多线程进程,就可以将一个进程中的多个线程分配到多个处理机上,使它们并行执行,这无疑将加速进程的完成。因此,现代处理机OS都无一例外地引入了多线程。
为何使用多线程?
- 使用多线程可以减少程序的响应时间。
- 与进程相比,线程的创建和切换开销更小。
- 多CPU计算机上使用多线程能提高CPU的利用率。
- 使用多线程能简化程序的结构。
2、如何实现java多线程?
- 继承Thread类,重写run()方法。
- 实现Runnable接口,并实现该接口的run()方法。
- 实现Callable接口,重写call()方法。
3、start()与run()方法的区别?
start()方法是启动一个线程,此时该线程处于就绪状态,而非运行状态,然后通过JVM调用线程类的run()方法来完成实际的操作,run()方法结束后,线程就会终止。
直接调用run()方法,会被当作一个普通的函数调用,程序中只有主线程这一个线程,也就是说start()方法能够异步地调用run()方法,但是直接调用run()方法却是同步的,因此无法达到多线程的目的。
4、多线程同步的实现方法有哪些?
1.synchronized关键字
synchronized方法-----synchronized代码块
2.wait()方法和notify()方法
3.lock
--lock():以阻塞的方式获取锁。
--tryLock()以非阻塞的方式获取锁。获取锁,若获取到返回true,否则立即返回false.
--tryLock(long timeout,TimeUnit unit)。获取锁,若获取到返回true,否则等待第一个参数的时间和第二个参数的单位,若超时立即返回false.
--lockInterruptibly():若获取到锁,返回,若没有则处于休眠状态。
5、sychronized与lock的区别
用法不同。
性能不同。
锁机制不同。