您的位置:首页 > 其它

多线程的详细介绍及使用

2020-07-14 05:32 190 查看

一、 首先给大家说一下线程调度的两种方式

  1. 分时调度
    所有线程轮流使用CUP的使用权,平均分配每个线程占用CPU的时间。
  2. 抢占式调度
    优先让优先级的线程先使用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选择执行谁,谁就会被执行。
那么这里给到一个多线程的内存图解(图片来源于传智播客)

六、 常用方法

  1. 获取当前线程
    Thread.currentThread();
  2. 获取当前线程的名字
    getName();
    我们通常将1.2连起来链式书写
    Thread.currentThread().getName();
  3. 设置线程名字
    setName();和创建带参数的构造方法
  4. 设置睡眠时间
    sleep(Long millis);以指定的毫秒数暂停

七、(重点)继承Thread和实现Runnable接口有什么区别
Runnable的优势
1. 适合多个相同程序的代码的线程去共享同一个资源
2. 避免java中单继承的局限性
3. 增加代码的健壮性,实现解耦操作,代码可以被多个线程共享,代码和线程独立
4. 线程池只能放入Runnable和Callable类线程,不能放入继承Thread的类
扩充:在java中,每次执行程序至少启动了两个线程,一个是main线程,一个是垃圾收集线程,每当java执行一个类的时候,实际就会启动一个JVM,每个JVM就是在操作系统中启动了一个进程

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: