网站的风格对比信息表深圳网站建设优化服务
web/
2025/9/27 19:40:59/
文章来源:
网站的风格对比信息表,深圳网站建设优化服务,设计网站建设价格,嘉兴网站制作平台一、线程与进程线程定义进程中执行的一个代码段#xff0c;来完成不同的任务组成#xff1a;线程ID#xff0c;当前指令指针(PC)#xff0c;寄存器集合(存储一部分正在执行线程的处理器状态的值)和堆栈进程定义执行的一段程序#xff0c;一旦程序被载入到内存中准备执行就…一、线程与进程线程定义进程中执行的一个代码段来完成不同的任务组成线程ID当前指令指针(PC)寄存器集合(存储一部分正在执行线程的处理器状态的值)和堆栈进程定义执行的一段程序一旦程序被载入到内存中准备执行就是一个进程组成文本区域(存储处理器执行的代码)、数据区域(存储变量和进程执行期间的动态分配的内存)和堆栈(存储着活动过程调用的指令和本地变量)例如Windows系统中运行的一个exe就是一个进程进入任务管理器可以查看系统运行的进程以及每个进程中的线程数线程与进程的关系1. 进程是系统内存分配的最小单位线程是系统调度的最小单位进程拥有自己的内存空间因为线程是属于进程的多线程直接共享该进程中内存提高了程序的运行效率2. 一个程序至少有一个进程一个进程中包括一条 or 多条线程线程不能独立于进程在Java中每次程序运行至少启动2个线程一个是main线程一个是垃圾收集线程。因为每当使用 Java 命令执行一个类时都会启动一个JVM每一个 JVM 实际上就是在操作系统中启动了一个进程3. 进程与线程都可以并发执行问题如何了解 “并发” 执行 它与 “并行”执行一样吗并行执行从宏观和微观的角度都是同时执行的并发执行从宏观角度似乎是同时执行但从微观角度不是同时执行操作系统采取时间片的机制使多个进程(线程)快速切换执行在宏观上就有并行执行的错觉在单核情况下不存在并行执行但在多核情况下进程(线程)分布在不同的CPU中可以并行执行程序二、线程的生命周期线程是一个动态执行的过程1. 新建状态 New创建线程对象进入新建状态此时线程属于 not alive直到执行 start()创建线程 使用 new 关键字和Thread 类或其子类 例如Thread t new MyThread();2. 就绪状态 Runnable调用线程对象的 start() 方法进入就绪状态此时线程属于 alive 但还未进入执行只是做好了被 CPU 调度的准备3. 运行状态 Running当线程获取到CPU进入运行状态线程的 run() 方法才开始被执行此时线程属于 alive只有当线程处于就绪状态才能被CPU调度所以就绪状态是运行状态的唯一入口4. 阻塞状态 Blocked处于运行状态的线程由于某种原因放弃使用CPU停止运行进入阻塞状态此时线程属于 alive同步阻塞同步锁 synchronized当某线程占有了该同步锁 则其他线程就不能进入到同步锁中则这些线程就会进入阻塞状态当在阻塞队列的线程获取到同步锁时才能进入到就绪状态等待被调度等待阻塞(理解得有点绕)调用线程的 wait() 线程进入等待状态此时会释放占用的 CPU 资源和锁(wait()方法需要在锁中使用)当被其他线程调用 notify() 唤醒之后需要重新获取对象的锁所以会先进入Blocked状态才会进入就绪状态其他阻塞调用线程的 sleep() 或 join() 或 发出了I/O请求线程会进入到阻塞状态当 sleep() 状态超时、join() 等待线程终止或者超时、或者 I/O 处理完毕时线程重新进入就绪状态5. 死亡状态 Dead当一个线程的 run() 方法运行完毕 or 被中断 or 被异常退出该线程进入死亡状态三、线程的创建- 实现 Runnable 接口实例化 Thread 类(线程无返回值)- 继承 Thread 类重写 Thread 的 run() 方法(线程无返回值)- 实现 Callable 接口通过FutureTask 包装器创建线程(线程有返回值)1. 实现 Runnable 接口实例化 Thread 类(线程无返回值)step1: 创建一个类例如 RunnableThread实现 Runnable 接口step2: 实例化 RunnableThread 对象 创建 Thread 对象将 RunnableThread 作为参数传给 Thread 类的构造函数然后通过 Thread.start() 方法启动线程运行结果问题 为什么创建 RunnableThread 对象后需要将它和 Thread 对象进行关联查看 Runnable 接口的源代码可以看到 Runnable 接口只有一个 run() 方法所以需要通过 Thread 类的 start() 方法来启动线程启动线程后Thread 类中的 run() 方法会先判断传入的 target Runnable 对象的 run() 方法是否为空若不为空则调用 target Runnable 对象的 run() 方法而且RunnableThread 类实现 Runnbale 接口中不能直接使用 Thread 类中的方法需要先获取到Thread 对象后才能调用 Thread 方法2. 继承 Thread 类重写 Thread 的 run() 方法(线程无返回值)step1: 创建一个类例如 MyThread继承 Thread 类重写 Thread 的 run() 方法step2: 实例化 MyThread 对象直接调用 start() 方法启动线程运行结果问题实现 Runnable 接口 和 继承 Thread 类运行结果不一样这是为什么继承 Thread 类和实现 Runnable 接口实现多线程会发现这是两个不同的实现多线程继承 Thread 类是多个线程分别完成自己的任务实现 Runnable 接口是多个线程共同完成一个任务其实用继承Thread类也可以实现只是比较麻烦这样的话实现 Runnable 接口比继承 Thread 类具有一定的优势1)适合多个相同的程序代码的线程去处理同一个资源2)可以避免 Java 中的单继承的限制当一个类继承 Thread 类后则不能在继承别的类而接口比较灵活可以实现多个接口而且实现接口了还可继续继承一个类3)增加程序的健壮性代码可以被多个线程共享代码和数据独立3. 实现 Callable 接口通过 FutureTask 包装器创建线程(线程有返回值)step1: 创建一个类例如 CallableThread实现 Callable 接口重写 Callable 接口的 call() 方法step2: 实例化 CallableThread 对象使用 FutureTask 类来包装 CallableThread 对象然后 FutureTask 对象作为参数传给 Thread 类的构造函数通过 Thread.start() 方法启动线程使用 FutureTask.get() 得到 Callable 接口的 call() 方法的返回值返回结果Callable 和 Runnable 相似类实例都需要被 Thread 执行但 Callable 接口能返回一个值或者抛出一个异常Runnable 不能实现 Callable 接口需要重写其唯一的 call() 方法FutureTask 实现了 Runable 接口 和 Future 接口所以如果想 Callable 实例作为 Thread 的执行体就必须通过 FutureTask 来作为桥梁
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/82937.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!