其他
线程线程和进程的区别进程是一个可执行的程序,是系统资源分配的基本单位。线程是进程内部相对独立的可执行单元,是操作系统进行任务调度的基本单位。多线程的优缺点优点:充分利用多核多cpu的资源,提高cpu的使用率,提高了程序的运行效率。缺点:线程数过多会影响性能,操作系统会在线程切换之间增加内存的开销。存在线程同步和安全问题可能产生死锁增加了开发人员的技术难度线程有几种状态一共五种状态:分别是新建,就绪,运行,阻塞和死亡状态。详细见下图:新建状态:当用new创建一个线程时,线程还没有开始运行,此时线程处于新建状态。处于新建状态的线程还没有开始运行。就绪状态:一个新建的线程并不会自动运行,要执行线程,要手动调用线程的start()方法,当start()方法返回后,线程就处于就绪状态,等待处理器的调度。运行状态:当线程获取了CPU的时间后,它才进入运行状态,真正的执行run()方法里的内容。阻塞状态:线程运行过程中,可能因为各种原因进入阻塞状态:比如调用sleep()进入休眠状态;调用一个在IO上被阻塞的操作,即该操作在输入输出操作完成之前不会返回到它的调用者;等待获取锁被阻塞;线程在等待其他的触发条件。所谓的阻塞状态就是正在运行的线程没有运行结束,暂时让出CPU资源。死亡状态:有两个原因会导致线程死亡:run()方法正常结束;一个未捕获的异常终止了run()方法而导致线程猝死。经典题:一个线程OOM了,其他线程是否还能运行?答案是还能运行。虽然说堆是线程共享的区域,一个线程堆抛出OOM异常,你可能会觉得其他线程也会抛出OOM异常。但其实不然,当一个线程抛出OOM异常后,它所占据的内存会全部释放掉,从而不会影响其他线程的运行。另外如果主线程异常了,子线程还能运行吗?这个问题也是可以运行的。线程不像进程,一个进程之间的线程之间是没有父子之分的,都是平级关系。即线程都是一样的,退出了一个不会影响另外一个。创建线程的几种方法继承Thread类,重写run()方法,利用Thread.start()启动线程。实现Runnable接口,重写run()方法,通过new