Java线程与多线程

Wesley13
• 阅读 673

1 线程与多线程

1.1 线程是什么?

线程(Thread)是一个对象(Object)。用来干什么?Java 线程(也称 JVM 线程)是 Java 进程内允许多个同时进行的任务。该进程内并发的任务成为线程(Thread),一个进程里至少一个线程。

Java 程序采用多线程方式来支持大量的并发请求处理,程序如果在多线程方式执行下,其复杂度远高于单线程串行执行。那么多线程:指的是这个程序(一个进程)运行时产生了不止一个线程。

1.2 为啥使用多线程?

  • 适合多核处理器。一个线程运行在一个处理器核心上,那么多线程可以分配到多个处理器核心上,更好地利用多核处理器。
  • 防止阻塞。将数据一致性不强的操作使用多线程技术(或者消息队列)加快代码逻辑处理,缩短响应时间。

聊到多线程,多半会聊并发与并行,咋理解并区分这两个的区别呢?

  • 类似单个 CPU ,通过 CPU 调度算法等,处理多个任务的能力,叫并发
  • 类似多个 CPU ,同时并且处理相同多个任务的能力,叫做并行

2 线程的创建与运行

2.1 线程的创建

Java 创建线程对象有两种方法:

  • 继承 Thread 类创建线程对象
  • 实现 Runnable 接口类创建线程对象

2.1.1 继承 Thread 类创建线程对象

新建 MyThread 对象,代码如下:

public class MyThread extends Thread { 
    @Override // 可以省略 
    public void run() { 
        System.out.println("MyThread 的线程对象正在执行任务"); 
    } 
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            MyThread thread = new MyThread();
            thread.start();
            System.out.println("MyThread 的线程对象 " + thread.getId()); 
        } 
    }
}

MyThread 类继承了 Thread 对象,并重写(Override)了 run 方法,实现线程里面的逻辑。main 函数是使用 for 语句,循环创建了 10 个线程,调用 start 方法启动线程,最后打印当前线程对象的 ID。

** run 方法和 start 方法的区别是什么呢?**

  • run 方法就是跑的意思,线程启动后,会调用 run 方法。

  • start 方法就是启动的意思,就是启动新线程实例。启动线程后,才会调线程的 run 方法。

执行 main 方法后,控制台打印如下:

MyThread 的线程对象正在执行任务
MyThread 的线程对象 10
MyThread 的线程对象正在执行任务
MyThread 的线程对象 11
MyThread 的线程对象正在执行任务
MyThread 的线程对象 12
MyThread 的线程对象正在执行任务
MyThread 的线程对象 13
MyThread 的线程对象正在执行任务
MyThread 的线程对象 14
MyThread 的线程对象正在执行任务
MyThread 的线程对象 15
MyThread 的线程对象正在执行任务
MyThread 的线程对象 16
MyThread 的线程对象正在执行任务
MyThread 的线程对象 17
MyThread 的线程对象正在执行任务
MyThread 的线程对象 18
MyThread的线程对象正在执行任务
MyThread 的线程对象 19

可见,线程的 ID 是线程唯一标识符,每个线程 ID 都是不一样的。

start 方法和 run 方法的关系如图所示:

Java线程与多线程

2.1.2 实现 Runnable 接口类创建线程对象

实现 Runnable接口类创建线程对象也很简单,只是不同的形式。

新建 MyThreadBrother 代码如下:

public class MyThreadBrother implements Runnable { 
    @Override // 可以省略 
    public void run() { 
        System.out.println("MyThreadBrother 的线程对象正在执行任务"); 
    } 
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            Thread thread = new Thread(new MyThreadBrother()); thread.start(); System.out.println("MyThreadBrother 的线程对象 " + thread.getId()); 
        } 
    }
}

2.2 线程的运行

在运行上面两个小 demo 后,JVM 执行了 main函数线程,然后在主线程中执行创建了新的线程。正常情况下,所有线程执行到运行结束为止。除非某个线程中调用了 System.exit(1) 则被终止。

在实际开发中,一个请求到响应式是一个线程。但在这个线程中可以使用线程池创建新的线程,去执行任务。

Java线程与多线程

3 线程的状态

新建 MyThreadInfo 类,打印线程对象属性,代码如下:

public class MyThreadInfo extends Thread {
    @Override // 可以省略 
    public void run() { 
        System.out.println("MyThreadInfo 的线程实例正在执行任务");
        // System.exit(1); 
    } 
    public static void main(String[] args) {
        MyThreadInfo thread = new MyThreadInfo(); 
        thread.start();
        System.out.print("MyThreadInfo 的线程对象 " + "线程唯一标识符:" + thread.getId() + " " + "线程名称:" + thread.getName() + " " + "线程状态:" + thread.getState() + " " + "线程优先级:" + thread.getPriority()); 
    }
}

执行代码打印如下:

MyThreadInfo 的线程实例正在执行任务
MyThreadInfo 的线程对象 线程唯一标识符:10 线程名称:Thread-0 线程状态:NEW 线程优先级:5

线程是一个对象,它有唯一标识符 ID、名称、状态、优先级等属性。线程只能修改其优先级和名称等属性 ,无法修改 ID 、状态。ID 是 JVM 分配的,名字默认也为 Thread-XX,XX是一组数字。线程初始状态为 NEW。

线程优先级的范围是 1 到 10 ,其中 1 是最低优先级,10 是最高优先级。不推荐改变线程的优先级,如果业务需要,自然可以修改线程优先级到最高,或者最低。

线程的状态实现通过 Thread.State 常量类实现,有 6 种线程状态:new(新建)、runnnable(可运行)、blocked(阻塞)、waiting(等待)、time waiting (定时等待)和 terminated(终止)。状态转换图如下: Java线程与多线程

线程状态流程大致如下:

  • 线程创建后,进入 new 状态
  • 调用 start 或者 run 方法,进入 runnable 状态
  • JVM 按照线程优先级及时间分片等执行 runnable 状态的线程。开始执行时,进入 running 状态
  • 如果线程执行 sleep、wait、join,或者进入 IO 阻塞等。进入 wait 或者 blocked 状态
  • 线程执行完毕后,线程被线程队列移除。最后为 terminated 状态。

如果本文有帮助到你,希望能动动小手点个赞。 如有错误请多指正!如有雷同!纯属巧合!

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java多线程常见问题
Java多线程是什么Java提供的并发(同时、独立)处理多个任务的机制。多个线程共存于同一JVM进程里面,所以共用相同的内存空间,较之多进程,多线程之间的通信更轻量级。依我的理解,Java多线程完全就是为了提高CPU的利用率。Java的线程有4种状态,新建(New)、运行(Runnable)、阻塞(Blocked)、结束(Dead),关键就在于阻塞(Bl
Wesley13 Wesley13
3年前
4、jstack查看线程栈信息
1、介绍利用jps、top、jstack命令找到进程中耗时最大的线程,以及线程状态等等,同时最后还可以显示出死锁的线程查找:FoundoneJavaleveldeadlock即可1、jps获得进程号!(https://oscimg.oschina.net/oscnet/da00a309fa6
Wesley13 Wesley13
3年前
2019秋招复习笔记
第一模块并发与多线程Java多线程方法:实现Runnable接口,继承thread类,使用线程池操作系统层面的进程与线程(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fb
Stella981 Stella981
3年前
Noark入门之线程模型
0x00单线程多进程单线程与单进程多线程的目的都是想尽可能的利用CPU,减少CPU的空闲时间,特别是多核环境,今天咱不做深度解读,跳过...0x01线程池锁最早的一部分游戏服务器是采用线程池的方式来处理玩家的业务请求,以达最大限度的利用多核优势来提高处理业务能力。但线程池同时也带来了并发问题,为了解决同一玩家多个业务请求不被
Wesley13 Wesley13
3年前
Java高级教程02
\TOC\1.Java线程1.1.多线程和多进程多进程:操作系统能够同时进行多个任务:每个app(word,播放器,浏览器)可以同时运行多线程:同一应用程序中哟多个顺序流同时执行线程是进程中的一部分1.2.线程的执行过程:!(
Wesley13 Wesley13
3年前
JAVA多线程的学习笔记
第一次在开源中国上发博文,简单的把以前在达内培训JAVA时的一篇日志复制共享一下。多进程(多任务)-针对OS多线程(Thread)-一个进程内部的多任务java语言(JVM)支持多线程编程java.lang.ThreadThread类由JDK提供,用于封装对JVM中线程的控制,调用C语言的类库实现。1、创
Wesley13 Wesley13
3年前
Java总结:Java多线程
多线程作为Java中很重要的一个知识点,在此还是有必要总结一下的。Java给多线程编程提供了内置的支持。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。这里定义和线程相关的另一个术语进程:一个进程包括由操作系统分配的内存空间,
深入浅出线程池 | 京东云技术团队
一、线程1、什么是线程线程(thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。2、如何创建线程2.1、JAVA中