多线程

简介: 线程是进程中执行运算的最小单位,是进程内部的一个执行单元1、多个线程同时进行,采用枪占的机制,单核计算机一个时间只有一个线程执行,采用枪占资源的方式

较为详细扩展的文章可参见这篇博客:
https://blog.csdn.net/qq_34337272/article/details/79640870

一、线程定义

线程是进程中执行运算的最小单位,是进程内部的一个执行单元
1、多个线程同时进行,采用枪占的机制,单核计算机一个时间只有一个线程执行,采用枪占资源的方式

二、多线程的优势

1、最大限度的提高计算机系统的利用效率
2、充分利用网络和系统资源

三、主线程

main方法为主线程入口
主线程必须最后执行

四、创建线程

1、继承Thread类
重写run方法
测试中只需要创建线程对象即可
2、实现Runnable接口
测试诶中创建线程时候,需要
Thread thread=new Thread(m,name);
m为线程类的实例
name为此线程的名字

两种方法的区别
Thread方法较简单,适用于单继承
Runnable很好的避免了java中的单根继承,并且使用这种方法可以共享数据资源。

五、线程的状态

1、新生(创建)
new但是还没调用start方法
2、就绪
调用了start方法,但是未抢到CPU的资源
3、运行
执行run方法
4、阻塞
是一种不可运行状态,造成阻塞的原因:
*执行Thread.sleep()方法
*IO操作时,IO操作未完成
*需要得到琐,但是琐被占用
5、死亡
退出main方法

六、线程调度

1、线程优先级
①设置优先级
setPriority(int guid)
②1-10表示优先级,10最高,5为默认,每一个优先级对应Thread的一个公用静态常量
NORM_PRIORITY=5
MIN_PRIORITY=1
MAX_PRIORITY=10
线程的优先级只是表示一个抢到资源的概率,不一定每次优先级高的都先运行,只是表示有这种可能性
2、实现线程调度的方法
①sleep
静态方法
要用Thread.sleep(1000);括号内为毫秒数
强制让线程休眠
②join
非静态方法
线程名.join();
谁调用join方法,该线程就先执行完,也有可能出现要加入的线程在未达到join条件时就已执行完毕,这时候join就不起作用了。
③yield
静态方法
Thread.yield
线程的礼让
可以让当前线程暂停执行,允许其他线程执行,但该线程任然可运行状态,此时,系统选择其他或更高优先级的线程执行,如无其他,则该线程继续执行,

七、线程同步

高并发安全性问题:马上双十一了,很多多人同一时间点会访问同一数据,这时候线程安全就很重要了
线程同步:
所谓线程同步就是当两个或多个线程要访问同一资源时,需要以某种顺序来确保某一时刻只能一个线程使用的方式
1、同步代码块
在访问修饰符前或后加synchronized,比如这个例子

package demo4;
/*
 * 线程同步测试
 * 1、同步代码块
 */
public class MyThread implements Runnable {
  private int count=10;//显示余票
  private int piao;//显示抢到几张票
  @Override
  public void run() {
    while(true) {
      synchronized (this) {
        if (count <= 0) {
          break;
        }
        count--;
        piao++;
        //模拟网络延迟
        try {
          Thread.sleep(2000);
        } catch (InterruptedException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "抢到弟" + piao + "张票,剩余" + count + "张票!");
      }
    }
  }
}

注意:eclipse自动生成同步代码块的快捷键
右键——Surround with——synchronized...
2、同步方法

package demo5;
/*
 * 线程同步测试
 * 2、同步方法
 */
public class MyThread implements Runnable {
  private int count=10;//显示余票
  private int piao;//显示抢到几张票
  boolean flag=true;
  @Override
  public void run() {
    while(flag) {
      buy();
    }
  }
  synchronized public void buy() {
    if (count <= 0) {
      flag=false;
      return;
    }
    //模拟网络延迟
    try {
      Thread.sleep(1000);
    } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    count--;
    piao++;
    System.out.println(Thread.currentThread().getName() + "抢到弟" + this.piao + "张票,剩余" + this.count + "张票!");
  }
}

注意:并不是同步的代码越多越好,容易出现死锁现象

线程同步涉及的类和方法(重要)

1、ArryLit类的add方法:是非线程同步,不安全的
2、StringBuffer同步安全
StringBuilder非同步,不安全
3、线程安全的:能同步,共享资源,安全
非线程安全:效率高
4、HashMap:建只能有一个为空,值不能为空,不安全
Hashtable:键值都不允许为空,安全

目录
相关文章
|
Cloud Native 网络协议 数据中心
Overlay网络与Underlay网络:深入探索与全面对比
在当今云原生的世界中🌍☁️,网络是构建和维护任何分布式系统的基石💎。了解Overlay网络和Underlay网络及其之间的区别🔍,对于设计高效、可扩展的云原生应用至关重要🚀。本文旨在全面解析Overlay和Underlay网络,揭示它们的工作原理、优缺点,并说明何种情况下应该使用哪一种网络📚。
Overlay网络与Underlay网络:深入探索与全面对比
|
12月前
|
机器学习/深度学习 数据采集 供应链
Python实现深度学习模型:智能库存管理系统
【10月更文挑战第5天】 Python实现深度学习模型:智能库存管理系统
881 9
|
11月前
|
人工智能 运维 监控
智能运维在现代数据中心的应用与挑战
随着云计算和大数据技术的迅猛发展,现代数据中心的运维管理面临着前所未有的挑战。本文探讨了智能运维技术在数据中心中的应用,包括自动化监控、故障预测与诊断、资源优化等方面,并分析了当前面临的主要挑战,如数据安全、系统集成复杂性等。通过实际案例分析,展示了智能运维如何帮助数据中心提高效率、降低成本,并提出了未来发展趋势和建议。
|
SQL Java 数据库连接
MyBatis-Plus更新使用null值
MyBatis-Plus更新使用null值
520 2
|
DataWorks 安全 API
DataWorks产品使用合集之遇到无法查看到VPC网络连接,是什么原因
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
133 1
|
JavaScript 前端开发 搜索推荐
Vue 的服务器端渲染(SSR)和客户端渲染(CSR)在渲染过程、性能、用户体验等方面都存在显著的区别
【5月更文挑战第8天】Vue 的 SSR 和 CSR 在渲染上有明显差异。SSR 服务器端生成 HTML 返回给浏览器,提供更快首屏加载和更好的 SEO,但增加服务器负担。CSR 客户端渲染,首次加载可能较慢,但交互更流畅,开发更简单。两者各有优劣,需根据项目需求权衡选择。
177 2
|
XML 存储 JSON
C# | DataGridView数据转存为Json、XML格式
DataGridView是常用的数据展示组件,而将其转存为Json或XML格式,则可以方便地进行数据的传输和存储。 Json格式具有轻量、易读、易解析等优点,广泛应用于Web开发、API接口传输等场景。 XML格式则具有良好的结构化特性,支持命名空间、数据类型等复杂数据表示方式,被广泛应用于数据交换、配置文件等领域。 因此,将DataGridView数据转存为Json、XML格式,不仅能够方便地进行数据的传输和存储,还能够满足不同场景下的数据需求。 本篇文章将介绍如何将DataGridView数据转存为Json、XML格式,并提供相应的代码示例。
382 0
C# | DataGridView数据转存为Json、XML格式
|
Linux
12. 【Linux教程】删除文件和目录
12. 【Linux教程】删除文件和目录
194 0
|
安全 Java C#
C#多线程详解
C#多线程详解
144 0