【JAVA基础】如何通俗的理解多线程
来源:互联网 发布:秦丝软件 编辑:程序博客网 时间:2024/06/06 10:53
1、进程
一个正在执行中的程序。每一个进程执行都有一个执行顺序,该顺序是一个执行路径或者叫一个控制单元。
2、线程
进程中的一个负责程序执行的控制单元,一个进程中可以多执行路径,称之为多线程。线程在控制着进程的执行。一个进程中至少有一个线程。
3、线程状态
(1)新建状态:新创建了一个线程对象
(2)就绪状态:线程对象创建后,其他线程调用了该对象的start()方法。该状态的线程位于可运行,等待获取CPU的使用权
(3)运行状态:就绪状态的线程获取了CPU,执行程序代码
(4)阻塞状态:阻塞状态是线程因为某种原因放弃CPU使用权,暂时停止运行。知道线程进入就绪状态,才有机会转到运行状态
4、创建线程的两种方式
(1)第一种方式:继承Thread类
步骤:
1、定义类继承Thread
2、复写Thread类中的run方法
3、调用线程的start方法(该方法两个作用:启动线程,调用run方法)
class Demo extends Thread{private String name;Demo(String name){super(name);//this.name = name;}public void run(){for(int x=0; x<10; x++){//for(int y=-9999999; y<999999999; y++){}System.out.println(name+"....x="+x+".....name="+Thread.currentThread().getName());}}}class ThreadDemo2 {public static void main(String[] args) {/*创建线程的目的是为了开启一条执行路径,去运行指定的代码和其他代码实现同时运行。而运行的指定代码就是这个执行路径的任务。jvm创建的主线程的任务都定义在了主函数中。而自定义的线程它的任务在哪儿呢?Thread类用于描述线程,线程是需要任务的。所以Thread类也对任务的描述。这个任务就通过Thread类中的run方法来体现。也就是说,run方法就是封装自定义线程运行任务的函数。run方法中定义就是线程要运行的任务代码。开启线程是为了运行指定代码,所以只有继承Thread类,并复写run方法。将运行的代码定义在run方法中即可。 */////Thread t1 = new Thread();Demo d1 = new Demo("旺财");Demo d2 = new Demo("xiaoqiang");d1.start();//开启线程,调用run方法。d2.start();System.out.println("over...."+Thread.currentThread().getName());}}
(2)第二种方式:实现Runnable
步骤:
1、定义类实现Runnable接口
2、覆盖Runable接口中的方法
3、通过Thread类建立线程对象
4、将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数
5、调用Thread类的start方法开启线程并调用Runnable接口子类的run方法
class Thread2 implements Runnable{ private String name; public Thread2(String name) { this.name=name; } @Override public void run() { for (int i = 0; i < 5; i++) { System.out.println(name + "运行 : " + i); try { Thread.sleep((int) Math.random() * 10); } catch (InterruptedException e) { e.printStackTrace(); } } } } public class Main { public static void main(String[] args) { new Thread(new Thread2("C")).start(); new Thread(new Thread2("D")).start(); } }
(3)实现Runnable接口比继承Thread类所具有的优势与区别
优势:
适合多个相同的程序代码的线程去处理同一个资源;
可以避免java中的单继承限制;
增加程序的健壮性,代码可以被多个线程共享,代码和数据独立
线程池只能放入实现Runnable或者callable类线程,不能直接放入继承Thread的类
区别:
继承Thread:线程代码存放Thread子类的run 方法中
实现Runnable:线程代码存放在接口的子类的run方法
实际上所有的多线程代码都是通过Thread的start()方法来运行的。因此,不管是扩展Thread类还是实现Runnable接口来实现多线程,最终还是通过Thread的对象的API来控制线程的,熟悉Thread类的API是进行多线程编程的基础
- 【JAVA基础】如何通俗的理解多线程
- 如何通俗的理解递归
- 如何通俗的理解Gradle?
- 如何通俗的理解java的依赖注入!
- java迭代器的通俗理解
- Java概念的通俗理解
- 八大基础算法 自己的通俗理解
- java多线程基础理解
- 如何通俗理解递归
- Java回调函数的通俗理解
- 关于java接口的通俗理解
- java回调机制的通俗理解
- 通俗理解JAVA的多态机制
- 通俗理解JAVA接口
- java中关于new 的理解(通俗的理解)
- MMU的通俗理解
- 管程的通俗理解
- 傅里叶变换的通俗理解
- GreenDao3.2.0简介与基本操作
- jq获取h5的自定义data-属性的问题
- 利用js如何做到让页面全屏和不全屏功能
- 在eclipse 运行 spark应用
- Eclipse 下 Tomcat 抛锚
- 【JAVA基础】如何通俗的理解多线程
- 信息安全数学基础 第一篇-数论基础-第一章 整除
- 欢迎使用CSDN-markdown编辑器
- UVA-12371 Guard
- 机器学习,深度学习必备数据集
- 零碎知识点
- 【Scikit-Learn 中文文档】八:最近邻
- oracle 全文索引
- Function类型(1)