多线程的详细介绍及使用
一、 首先给大家说一下线程调度的两种方式
- 分时调度
所有线程轮流使用CUP的使用权,平均分配每个线程占用CPU的时间。 - 抢占式调度
优先让优先级的线程先使用CPU,当线程优先级相同时,随机选取一个线程执行,其中java使用的是抢占式调度。
二、 单线程
单线程程序中只有一个线程,执行从main方法开始,从上到下开始执行,JVM执行main方法,main方法会进入栈内存中,JVM会找操作系统开辟一条main方法通向CPU的路径,CPU可以通过这个路径来执行main方法,而这个路径有一个名字,叫做main线程,也就是主线程。
三、 多线程
线程是操作系统能够进行运算调度的最小单位,而多线程就是在软件或者硬件上并发执行多个线程。简单来说:线程是程序中一个单一的顺序控制流程;而多线程就是在单个程序中同时运行多个线程来完成不同的工作。
单线程程序有一个弊端,当运行到程序中间时,如果发生异常,那么剩下的程序部分就不会被执行。当有多个线程时,就可以避免这种弊端。java虚拟机支持应用程序并发的执行多个执行线程。
四、 创建执行线程的两种方法
1. 继承Thread类(在java.lang包下)
步骤:
创建一个Thread子类,重写run方法。
例:
public class PrimeThread extends Thread{ @Override public void run(){ for(int i=0;i<20;i++){ System.out.println(“run”+i); } } }
创建子类对象,调用start方法,执行run方法
public class Demo{ public static void main(String[ ] args){ PrimeThread pt=new PrimeThread(); Pt.start(); for(int i=0;i<20;i++){ System.out.println(“main”+i); } } }
2.实现Runnable接口(在java.lang包下)
步骤:
创建一个类,实现Runnable接口。
例:
public class PrimeThread implements Runnable{ @Override public void run(){ for(int i=0;i<20;i++){ System.out.println(“run”+i); } } }
创建实现类对象和Thread对象,将实现类对象传递到Thread对象中,
调用start方法,执行run方法
public class Demo{ public static void main(String[ ] args){ PrimeThread pt=new PrimeThread(); Thread t=new Thread(pt); t.start(); } }
五、 多线程执行原理
那么有时候为什么会出现随机打印的结果呢?
执行4.1之后会出现随机打印的结果
程序启动时,JVM会找OS开辟一条main方法通向cup的路径,这个路径就是主线程
当我们开启一个新线程的时候,就会开辟另一条路径来执行run方法
这时候对于cpu而言,就有了两条路径供它选择,这时候cpu选择执行谁,谁就会被执行。
那么这里给到一个多线程的内存图解(图片来源于传智播客)
六、 常用方法
- 获取当前线程
Thread.currentThread(); - 获取当前线程的名字
getName();
我们通常将1.2连起来链式书写
Thread.currentThread().getName(); - 设置线程名字
setName();和创建带参数的构造方法 - 设置睡眠时间
sleep(Long millis);以指定的毫秒数暂停
七、(重点)继承Thread和实现Runnable接口有什么区别
Runnable的优势
1. 适合多个相同程序的代码的线程去共享同一个资源
2. 避免java中单继承的局限性
3. 增加代码的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立
4. 线程池只能放入Runnable和Callable类线程,不能放入继承Thread的类
扩充:在java中,每次执行程序至少启动了两个线程,一个是main线程,一个是垃圾收集线程,每当java执行一个类的时候,实际就会启动一个JVM,每个JVM就是在操作系统中启动了一个进程
- c#中跨线程调用windows窗体控件 .我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题。然而我们并不能用传统方法来做这个问题,下面我将详细的介绍。
- 使用Tomcat-5.5.20配置数据库连接池详细介绍
- 使用Tomcat-5.5.20配置数据库连接池详细介绍
- 详细介绍查看Linux硬件信息命令的使用
- ASP.NET公有六种验证控件,本文详细介绍了看这些控件的使用方法。
- .NET中IsPostBack介绍:详细分析Page_load使用IsPostBack的原因
- 【转】C++指向类成员的指针的使用(详细介绍)
- 编辑器vi使用方法详细介绍
- Linux Grep命令使用的详细介绍
- tkprof的基本使用详细介绍
- asp.net Repeater控件的说明及详细介绍及使用方法
- EhCache使用详细介绍
- Winform分页控件使用详细介绍
- Android Fragments 详细使用详细介绍
- PHPMailer 发送邮件(含详细介绍及使用方法说明)
- Linux编辑器vi使用方法详细介绍
- 使用Tomcat-5.5.20配置数据库连接池详细介绍
- valang validator 使用详细介绍
- Linux Grep命令使用的详细介绍
- asp.net Repeater控件的说明及详细介绍及使用方法