Java-线程
最近准备笔试,看到有线程方面的笔试题,就总结了一下有关线程方面的知识
1.程序、进程、线程 程序:一段静态代码,应用软件的执行蓝本 进程:程序的一次动态执行,对应从代码加载,执行至完成的一整个完整过程,也是进程从产生、发展到消亡的过程 线程:比进程更小的执行单位,进程在执行过程中可以产生多个线程,形成多条执行线索,每条线索(线程)也有它自身的产生、存在和消亡的过程、也是一个动态的概念。 2.线程与进程的区别: (1)地址空间:进程内的一个执行单元,进程至少有一个线程,它们共享进程的地址空间,而进程有自己独立的地址空间;进程之间数据状态完全独立,线程间共享一块儿内存空间; (2)资源拥有:进程是资源分配和拥有的单位,同一个进程内的线程共享进程的资源;进程通过多个线程占据系统的资源,线程占CPU的基本单位; (3)线程是处理器调度的基本单位,但进程不是; (4)二者均可并发执行。 3.Java中的线程: ——每一个Java程序都有一个默认的主线程,当JVM加载代码发现main方法之后,就会立即启动主线程 主线程的特点: ①是产生其他子线程的线程 ②不一定是最后完成执行的线程 ——如果main方法中没有创建其他线程,那么当main方法执行完最后一个语句,JVM就会结束Java程序(单线程) ——如果main方法中又创建了其他的线程,那么JVM就要在主线程和其他线程之间轮流切换,JVM要等程序中所有的线程都结束之后才结束程序(多线程) 4.多线程的优势: 减轻编写的交互频繁,涉及多面的程序的困难; 程序的吞吐量会得到改善 由多个处理器的系统,可以并发运行不同的线程,否则任何时刻都只有一个线程在运行 同时执行是人的感觉,在线程之间实际上是轮换执行的 5.线程的使用场景:想要同时处理多事件(单线程处理不了,必须使用多线程);多个线程分解大任务(用单线程可以做,但使用多线程可以更快) 6.线程的生命周期:新建、就绪、运行、阻塞、死亡
新建:线程对象已经创建,还没有调用start()方法 可运行:线程调用start方法,但调度程序还没有把它选定为运行线程 运行:线程调度程序从可运行的线程池中选择一个线程作为当前线程 等待/阻塞/睡眠:线程仍是活的,但是没有条件运行,它是可运行的,当某事件出现,他可能返回到可运行状态 死亡:当线程的run方法完成即为死去,线程一旦死亡,就不能复生,一个死去的线程上调用start方法,会抛出Java.lang.illegalThreadException异常 7.Java中创建多线程 (1)继承Thread类:重写run方法–>new一个线程对象–>调用对象的start方法启动线程 (2)实现Runnable接口:实现run方法–>创建一个Runnable类的对象r,new MyRunnable–>创建Thread类的对象并将Runnable对象作为参数,newThread(r)–>调用Thread对象的start方法启动线程
(3)对比: ①继承Thread类实现多线程 1)优点:编写简单,如果需要访问当前线程直接使用this即可获得当前线程. 2)缺点:因为线程类已经继承了Thread类,不能再继承其他的父类 ②实现Runnable接口 1)优点:线程类只实现了Runable接口,还可以继承其他的类. 这种方式可以多个线程共享同一个目标(target)对象,非常适合多个相同线程来处理同一份资源的情况,从而可以将代码和数据分开,形成清晰的模型,较好地体现了面向对象的思想 2)缺点:编程稍微复杂,需要访问当前线程,必须使用Thread.currentThread()方法
|