首页 > 其他分享 >线程基础

线程基础

时间:2023-02-16 13:23:33浏览次数:39  
标签:run Thread 基础 start 线程 new 方法

Thread 类的每一个实例都表示一个线程, 进程是操作系统级别的多任务,JVM 就是运行在一个进程中的,所以在Java 中我我们只考虑线程

# 线程状态

 

 

 1.new :当我们new 一个线程时,该线程并没有纳入线程调度,而是处于一个new状态。

2.runnable: 当调用线程的start方法后,该线程纳入线程调度的控制,其处于一个可运行状态,等待分配时间片段以并发运行。

3.running:当线程被分配时间片段后其被cpu执行,这是该线程处于running状态。

4.blocked: 当线程在运行过程中可能会出现阻塞现象,比如等待用户输入信息等。但阻塞状态不是百分百出现的,具体要看代码中是否有相关需求。

5.Dead: 当线程的任务全部运行完毕,或在运行过程中抛出了一个未捕获的异常,那么线程结束,等待GC回收

# 创建线程

创建线程有两种方式

方式1:定义一个类并继承Thread,然后重写run方法,在其中书写线程任务逻辑:

Thread t1 = new MyThread1();
Thread t2 = new MyThread2();
t1.start();
t2.start();

class MyThread1 extends Thread {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("are you ok?");
}
}
}
class MyThread2 extends Thread {
public void run() {
for (int i = 0; i < 5; i++) {
System.out.println("of course");
}
}
}

启动线程要调用start方法,不能直接调用run方法。start方法会将当前线程纳入到线程调度中,使其具有并发运行的能力。start方法很快会执行完毕。当start方法执行完毕后,当前线程的run方法会很快的被执行起来(只要获取到了cpu时间片)。但不能理解为调用start方法时run方法就执行了!

线程有几个不可控因素:

  1. cpu分配时间片给哪个线程我们说了不算。

  2. 时间片长短也不可控。

  3. 线程调度会尽可能均匀的将时间片分配给多个线程。

第一种创建线程的方式存在两个不足:

  1. 由于java是单继承的,这就导致我们若继承了Thread类就无法再继承其他类,这在写项目时会遇到很大问题;

  2. 由于我们定义线程的同时重写run方法来定义线程要执行的任务,这就导致线程与任务有一个强耦合关系,线程的重用性变得非常局限。

    方式 2:定义一个类并实现Runnable接口然后在创建线程的同时将任务指定。因为是实现Runnable接口,所以不影响其继承其他类:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Thread t1 = new Thread(() -> {
    for (int i = 0; i < 5; i++) {
    System.out.println("are you ok?");
    }
    });
    t1.start();

    Thread t2 = new Thread(() -> {
    for (int i = 0; i < 5; i++) {
    System.out.println("of course");
    }
    });
    t2.start();
 

标签:run,Thread,基础,start,线程,new,方法
From: https://www.cnblogs.com/zrboke/p/17126291.html

相关文章

  • 进程和线程的区别
    ①进程是资源分配的最小单位,线程是资源调度的最小单位。②线程是在进程下运行的。一个进程可以包含多个线程。③进程有自己的独立地址空间,每启动一个进程,系统就会为它分......
  • (二)接口测试基础认知
    测试用例设计思路:从输入参数进行考虑设计:1)优先级-针对所有接口1、暴露给其他系统、第三方调用接口2、系统内部调用的核心功能接口3、系统内部调用的非核心功能接口2......
  • 基础-Linux的netfilter和iptables
    iptables是什么?你为啥要学?Linux的网络控制模块在内核中,叫做netfilter。而iptables是位于用户空间的一个命令行工具,它作用在OIS7层网络模型中的第四层,用来和内核的netfilte......
  • 线程进程多线程
               ......
  • 代码随想录算法Day14 | 理论基础,递归遍历,迭代遍历,统一迭代
    理论基础1、二叉树的种类满二叉树:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。    这棵二叉树为满二叉树,也......
  • 神经网络基础部件-卷积层详解
    前言在全连接层构成的多层感知机网络中,我们要通过将图像数据展平成一维向量来送入模型,但这会忽略了每个图像的空间结构信息。理想的策略应该是要利用相近像素之间的相互关......
  • 【多线程与高并发】- 线程基础与状态
    线程基础与状态......
  • SpringMvc基础
    SpringMVC1,SpringMVC简介看到SpringMVC这个名字我们会发现其中包含Spring,那么SpringMVC和Spring之间的会有关系么?答案是肯定有,SpringMVC隶属于Spring,是Spring技术中的......
  • 一次学俩Vue&Blazor:1.4基础-响应式数据
    一、声明式编程和响应式数据1、声明式编程逻辑层修改视图层元素属性值的方式有两种,一是命令式,先通过getElementById等方法获取元素对象,然后再修改对象的属性;二是声明式......
  • 1.基础自然语言任务
    基础自然语言任务词法任务:单词级别单词的形态划分(Morphologicalanalysis):将词的词根和词缀提取出来的任务分词(Wordsegmentation):对于中文等语言,语句是由字符序列......