看完这篇Java多线程的讲解,思路突然就清晰了...

开发 后端
在Java中,一个线程是指进程中的一个执行流程,一个进程可以运行多个线程,Java中每个线程都有一个调用栈,即使不在程序中创建任何新的线程,也有一个main()方法运行在一个线程内,称为主线程,一旦创建一个新的线程,就产生一个新的调用栈。

[[404032]]

线程是进程中的一个独立控制单元,线程在控制着进程的执行,一个进程中至少有一个线程。多线程可以更好地利用cpu的资源,线程之间还能进行数据共享。

在Java中,一个线程是指进程中的一个执行流程,一个进程可以运行多个线程,Java中每个线程都有一个调用栈,即使不在程序中创建任何新的线程,也有一个main()方法运行在一个线程内,称为主线程,一旦创建一个新的线程,就产生一个新的调用栈。

多线程的基本概念

线程指进程中的一个执行场景,也就是执行流程,那么进程和线程有什么区别呢?

  • 每个进程是一个应用程序,都有独立的内存空间
  • 同一个进程中的线程共享其进程中的内存和资源

(共享的内存是堆内存和方法区内存,栈内存不共享,每个线程有自己的。)

什么是进程?

一个进程就是一个应用程序。在操作系统中每启动一个应用程序就会相应的启动一个进程。例如:千千静听进程,魔兽进程,Word 进程,QQ 进程,JVM 启动对应一个进程。

系统引入多进程的作用?

最初的计算机是“单进程的”,计算机只能运行一个应用程序,例如第一台计算机只有DOS 窗口。现代的计算机可以满足我们一边听音乐,一边玩游戏。现代的计算给我们人类感觉:多件事情一起运行。感觉是并行的(错觉)。

对于单核的计算机来讲,在某一个时间点上只能做一件事情,但是由于计算机的处理速度 很高,多个进程之间完成频繁的切换执行,这个切换速度使人类产生了错觉,人类的错觉是:

多个进程在同时运行。

计算机引入多进程的作用:提高 CPU 的使用率。

  • 重点:进程和进程之间的内存独立。

什么是线程?

线程是进程的一个执行场景。一个进程可以启动多个线程。

进程引入多线程的作用?

提高进程的使用率。

  • 重点:线程和线程之间栈内存独立,堆内存和方法区内存共享。一个线程一个栈。

描述 java 程序的执行原理:

java命令执行会启动 JVM,JVM的启动表示启动一个应用程序,表示启动了一个进程。该进程会自动启动一个“主线程”,然后主线程负责调用某个类的 main 方法。所以 main 方法的执行是在主线程中执行的。然后通过main 方法代码的执行可以启动其他的“分支线程”。

所以,main 方法结束程序不一定结束,因为其他的分支线程有可能还在执行。

线程的创建和启动

Java 虚拟机的主线程入口是main 方法,用户可以自己创建线程,创建方式有两种:

  • 继承 Thread 类
  • 实现Runnable 接口(推荐使用Runnable 接口)

继承 Thread 类

Thread 类中创建线程最重要的两个方法为:

  1. public void run() 
  2.  
  3. public void start() 

 采用 Thread 类创建线程,用户只需要继承 Thread,覆盖 Thread 中的run 方法,父类 Thread 中的run 方法没有抛出异常,那么子类也不能抛出异常,最后采用start 启动线程即可

【示例代码】,不使用线程

  1.  public class ThreadTest01 { 
  2.     
  3. public static void main(String[] args) { Processor p = new Processor(); p.run(); 
  4.  
  5. method1(); 
  6.  
  7. private static void method1() { System.out.println("--------method1()   "); 
  8.  
  9. class Processor { 
  10.  
  11. public void run() { 
  12. for (int i=0; i<10; i++) { System.out.println(i); 

 

以上顺序输出相应的结果(属于串行),也就是run 方法完全执行完成后,才执行method1 方法,也就是method1 必须等待前面的方法返回才可以得到执行,这是一种“同步编程模型”

【代码示例】,使用线程

  1.  public class ThreadTest02 { 
  2.  
  3. public static void main(String[] args) { Processor p = new Processor(); 
  4.  
  5. //手动调用该方法 
  6. //不能采用run 来启动一个场景(线程), 
  7. //run 就是一个普通方法调用 
  8. //p.run(); 
  9.  
  10. //采用start 启动线程,不是直接调用run 
  11. //start 不是马上执行线程,而是使线程进入就绪 
  12. //线程的正真执行是由Java 的线程调度机制完成的 
  13. p.start(); 
  14.  
  15. //只能启动一次 
  16. //p.start(); 
  17.  
  18. method1(); 
  19.  
  20. private static void method1() { System.out.println("--------method1()   "); 
  21.  
  22. class Processor extends Thread { 
  23.  
  24. //覆盖 Thread 中的run 方法,该方法没有异常 
  25. //该方法是由java 线程掉机制调用的 
  26.   //我们不应该手动调用该方法public void run() { 
  27. for (int i=0; i<10; i++) { System.out.println(i); 

通过输出结果大家会看到,没有顺序执行,而在输出数字的同时执行了 method1()方法,如果从效率上看,采用多线程的示例要快些,因为我们可以看作他是同时执行的,mthod1()方法没有等待前面的操作完成才执行,这叫“异步编程模型”

实现 Runnable 接口

其实 Thread 对象本身就实现了Runnable 接口,但一般建议直接使用 Runnable接口来写多线程程序,因为接口会比类带来更多的好处

【示例代码】

  1. public class ThreadTest03 { 
  2.  
  3. public static void main(String[] args) { 
  4. //Processor r1 = new Processor(); Runnable r1 = new Processor(); 
  5. //不能直接调用run 
  6. //p.run(); 
  7.  
  8. Thread t1 = new Thread(r1); 
  9.    
  10. //启动线程t1.start(); 
  11.  
  12. method1(); 
  13.  
  14. private static void method1() { System.out.println("--------method1()   "); 
  15.  
  16. //实现Runnable 接口 
  17. class Processor implements Runnable { 
  18.  
  19. //实现Runnable 中的run 方法 
  20. public void run() { 
  21. for (int i=0; i<10; i++) { System.out.println(i); 

 

 

责任编辑:姜华 来源: 今日头条
相关推荐

2020-07-20 10:20:30

this前端代码

2022-07-01 13:38:48

雾计算边缘计算

2020-01-09 15:30:32

微服务架构互联网

2023-10-08 08:41:04

JavaPython编程语言

2024-09-27 11:51:33

Redis多线程单线程

2020-02-08 16:46:29

微服务架构复杂

2020-01-06 08:40:11

阿里场景服务

2021-05-08 07:53:33

面试线程池系统

2021-08-26 11:10:42

架构运维技术

2024-11-19 18:03:04

2017-03-07 15:35:26

Android适配 界面

2017-03-10 21:04:04

Android适配

2020-12-09 08:35:45

Shell脚本语法

2010-03-15 19:37:00

Java多线程同步

2019-11-27 08:41:41

Java进程虚拟机

2019-12-19 09:23:45

Java多线程数据

2019-08-01 11:04:10

Linux磁盘I

2019-10-30 09:25:58

NginxApache 服务器

2016-03-03 17:42:10

DockerDCOS

2019-07-10 15:15:23

JVM虚拟机Java
点赞
收藏

51CTO技术栈公众号