【线程系列一】线程如何运行

1 public static void main(String[] args)throws Exception {
2         Thread th= new Thread(new MyRunnable("hello1"));
3         th.start();
4         System.out.println("当前主线程 "+Thread.currentThread().getName());
5         System.out.println("该线程 "+th.getName());
6 }

上述代码,在内存中的状态如下图所示。执行步骤主要是下面四步。

1、运行上述java文件,由虚拟机执行类的入口main函数,分配了一个主线程。

2、main方法在主线程所在栈中,压栈,实例一个新的子线程,并开启了这个子线程

3、jvm给子线程分配了一块子线程栈,并在这个子线程栈中,将run()压栈执行。

4、由cpu调度各线程,分配给各线程的时间,由cpu决定,有两种模式,分时调度和抢占调度。

~分时调度

所有线程轮流使用 CPU 的使用权,平均分配每个线程占用 CPU 的时间。

~抢占式调度

优先让优先级高的线程使用 CPU,如果线程的优先级相同,那么会随机选择一个(线程随机性),Java使用的为抢占式调度。

时间: 2024-08-26 18:01:13

【线程系列一】线程如何运行的相关文章

线程系列09,线程的等待、通知,以及手动控制线程数量

当一个线程直到收到另一个线程的通知才执行相关的动作,这时候,就可以考虑使用"事件等待句柄(Event Wait Handles)".使用"事件等待句柄"主要用到3个类: AutoResetEvent, ManualResetEvent以及CountdownEvent(.NET 4.0以后才有).本篇包括: ※ 一个线程等待另一个线程的通知※ 2个线程互相通知等待※ 一个线程等待队列中的多个任务通知※ 手动控制线程的数量 □ 一个线程等待另一个线程的通知 最简单的情景

死磕 java线程系列之线程池深入解析——未来任务执行流程

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:线程池源码部分如无特殊说明均指ThreadPoolExecutor类. 简介 前面我们一起学习了线程池中普通任务的执行流程,但其实线程池中还有一种任务,叫作未来任务(future task),使用它您可以获取任务执行的结果,它是怎么实现的呢? 建议学习本章前先去看看彤哥之前写的<死磕 java线程系列之自己动手写一个线程池(续)>,有助于理解本章的内容,且那边的代码比较短小,学起来相对容易一些. 问题

死磕 java线程系列之线程模型

问题 (1)线程有哪些类型? (2)线程模型有哪些? (3)各语言是怎么实现自己的线程模型的? 简介 在Java中,我们平时所说的并发编程.多线程.共享资源等概念都是与线程相关的,这里所说的线程实际上应该叫作"用户线程",而对应到操作系统,还有另外一种线程叫作"内核线程". 用户线程位于内核之上,它的管理无需内核支持:而内核线程由操作系统来直接支持与管理.几乎所有的现代操作系统,包括 Windows.Linux.Mac OS X 和 Solaris,都支持内核线程.

死磕 java线程系列之线程池深入解析——构造方法

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 简介 ThreadPoolExecutor的构造方法是创建线程池的入口,虽然比较简单,但是信息量很大,由此也能引发一系列的问题,同样地,这也是面试中经常被问到的问题,下面彤哥只是列举了一部分关于ThreadPoolExecutor构造方法的问题,如果你都能回答上来,则可以不用看下面的分析了. 问题 (1)ThreadPoolExecutor有几个构造方法? (2)ThreadPoolExecutor最长的构

死磕 java线程系列之线程池深入解析——生命周期

摘自:https://www.cnblogs.com/tong-yuan/p/11748887.html (手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:线程池源码部分如无特殊说明均指ThreadPoolExecutor类. 简介 上一章我们一起重温了下线程的生命周期(六种状态还记得不?),但是你知不知道其实线程池也是有生命周期的呢?! 问题 (1)线程池的状态有哪些? (2)各种状态下对于任务队列中的任务有何影响? 先上源码 其实,在我们讲线程池体

死磕 java线程系列之线程池深入解析——体系结构

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 简介 Java的线程池是块硬骨头,对线程池的源码做深入研究不仅能提高对Java整个并发编程的理解,也能提高自己在面试中的表现,增加被录取的可能性. 本系列将分成很多个章节,本章作为线程池的第一章将对整个线程池体系做一个总览. 体系结构 上图列举了线程池中非常重要的接口和类: (1)Executor,线程池顶级接口: (2)ExecutorService,线程池次级接口,对Executor做了一些扩展,增加一

死磕 java线程系列之线程的生命周期

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的. 常见的错误有:就绪状态.运行中状态(RUNNING).死亡状态.中断状态.只有阻塞没有等待状态.流程图乱画等,最常见的错误就是说线程只有5种状态. 今天这篇文章会彻底讲清楚线程的生命周期,并分析synchronized锁.基于AQS的锁中线程状态变化的逻辑. 所以,对synchronized锁和AQS原理(

死磕 java线程系列之线程池深入解析——定时任务执行流程

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本. 注:本文基于ScheduledThreadPoolExecutor定时线程池类. 简介 前面我们一起学习了普通任务.未来任务的执行流程,今天我们再来学习一种新的任务--定时任务. 定时任务是我们经常会用到的一种任务,它表示在未来某个时刻执行,或者未来按照某种规则重复执行的任务. 问题 (1)如何保证任务是在未来某个时刻才被执行? (2)如何保证任务按照某种规则重复执行? 来个栗子 创建一个定时线程池,用它来

线程系列10,无需显式调用线程的情形

通常,我们会通过线程的构造函数先创建线程再使用线程.而实际上,.NET中有些类提供的方法,其内部就是使用多线程处理的.一些封装了多线程.异步处理方法的类都符合了"事件驱动异步模式(event-based asynchronous pattern)".以System.ComponentModel下的BackgroundWorker类来说,该类就符合这种模式. BackgroundWorker类属性:WorkerSupportsCancellation:设置为true表示允许取消Worke

线程系列08,实现线程锁的各种方式,使用lock,Montor,Mutex,Semaphore以及线程死锁

当涉及到多线程共享数据,需要数据同步的时候,就可以考虑使用线程锁了.本篇体验线程锁的各种用法以及线程死锁.主要包括: ※ 使用lock处理数据同步※ 使用Monitor.Enter和Monitor.Exit处理数据同步※ 使用Mutex处理进程间数据同步※ 使用Semaphore处理数据同步※ 线程死锁 □ 使用lock处理数据同步 假设有一个类,主要用来计算该类2个字段的商,在计算商的方法之内让被除数自减,即被除数有可能为零.使用lock语句块保证每次只有一个线程进入该方法. class Th