首页 > 01 多线程概念及其实现方式

01 多线程概念及其实现方式

  • 多线程是编程过程里必不可少的内容,学习多线程,就先要了解进程和线程的概念。
  • 进程:是指当前正在运行的程序,是一个程序在内存里的执行区域;
  • 线程:是在进程里的一个执行控制单元,执行路径;

 

实现多线程的方式有两种,一种是继承Thread类,一种是实现runnable接口。

1.继承Thread类

a) 根据API中的描述:创建新执行线程,继承Thread类方法是将类声明为 Thread 的子类。该子类应重写 Thread 类的 run 方法。

如下所示:

public class ThreadDemo extends Thread {@Overridepublic void run() {for (int i=0;i<100;i++){System.out.println(getName()+":"+i);}}
}
  • getName()  方法用于 返回该线程的名称

 

b) 接下来可以分配并启动该子类的实例

如下所示:

    public static void main(String[] args) {ThreadDemo xc = new ThreadDemo();xc.setName("thread1");xc.start();ThreadDemo xc2= new ThreadDemo();xc2.setName("thread2");xc2.start();}
  • setName(String name)方法可以改变线程名称,使之与参数 name 相同
  • start()   方法使该线程开始执行;Java 虚拟机调用该线程的 run 方法

 

2.实现runnable接口

a) API中的描述是:创建线程的另一种方法是声明实现 Runnable 接口的类。该类然后实现 run 方法。然后可以分配该类的实例,在创建 Thread 时作为一个参数来传递并启动

如下所示:

public class RunableDemo implements  Runnable {public void run() {for (int i = 0; i < 100; i++) {System.out.println(Thread.currentThread().getName()+":"+i);}}
}
  • currentThread()我们实现了Runnable接口,接口里是没有getName方法的,所以如果我们想要获得到当前线程的基本信息,就需要用到Thread类的这个方法。API中描述:返回对当前正在执行的线程对象的引用,这个对象中是有getName()方法的。

b) 调用线程时,是使用Thread类,继承的对象作为一个参数传入

如下所示:

    public static void main(String[] args) {RunableDemo xc = new RunableDemo();Thread thread = new Thread(xc);thread.setName("thread1");thread.start();Thread thread2 = new Thread(xc);thread2.setName("thread2");thread2.start();}
  • RunableDemo 实现了Runnable接口,这个对象作为runnable类型的对象传入Thread类中
  • 最后通过start()方法进行启动,运行线程中的run()方法

 

 

在多线程中会出现需要同步操作的时候,例如扣费、减库存等,如果操作不用同步有可能导致库存为负数的情况。实现同步的方法如下:

1.同步代码块

关键字为synchronized,需要定义一把锁,这把锁需要所有的线程都共用,且锁可以为任意对象

代码如下:

//定义一把锁,在方法外以共用
Object obj = new Object();public void tongbu(){    synchronized(obj){             System.out.println("同步代码块");}      
}    

 

2.同步方法

关键字也为synchronized

代码如下:

public synchronized void tongbu(){            System.out.println("同步方法");    
}   

 

注:同步方法的synchronized 也是有锁的,非静态方法调用的是类本身(this);静态方法因为加载在实体类之前,调用不到类本身,所以用到的是字节码对象(class类)

 

转载于:https://www.cnblogs.com/wlym/p/9684088.html

更多相关:

  • 来源:公众号|计算机视觉工坊(系投稿)作者:仲夏夜之星「3D视觉工坊」技术交流群已经成立,目前大约有12000人,方向主要涉及3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、...

  • 点云PCL免费知识星球,点云论文速读。文章:Real-Time LIDAR-Based Urban Road and Sidewalk Detection for Autonomous Vehicles作者:Ern˝o Horváth  , Claudiu Pozna ,and Miklós Unger编译:点云PCL代码:http...

  • 文章:Semantic Histogram Based Graph Matching for Real-Time Multi-Robot Global Localization in Large Scale Environment作者:Xiyue Guo, Junjie Hu, Junfeng Chen, Fuqin Deng, T...

  • 点云PCL免费知识星球,点云论文速读。文章:Robust Place Recognition using an Imaging Lidar作者:Tixiao Shan, Brendan Englot, Fabio Duarte, Carlo Ratti, and Daniela Rus编译:点云PCL(ICRA 2021)开源代码:...

  • 文章:A Survey of Calibration Methods for Optical See-Through Head-Mounted Displays作者:Jens Grubert , Yuta Itoh, Kenneth Moser编译:点云PCL本文仅做学术分享,如有侵权,请联系删除。欢迎各位加入免费知识星球,获取PD...

  • 多线程有什么好处?提高CPU的利用率,更好地利用系统资源,使用Monitor类可以同步静态/实例化的方法的全部代码或者部分代码段,使用不同的同步类创建自己的同步机制。多线程指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程提升整体处理性能。多线程是指程序中包含多个执行流,即...

  • Step1:在界面主函数的构造函数中初始化多线程 auto mythread = new QThread(); //新建connect(mythread , &QThread::finished, mythread, &QObject::deleteLater);//线程运行结束后释放内存object1->moveToThread...

  • 一、thread的基本用法 参见C++使用thread类多线程编程 。 二、类外使用多线程,访问类的成员 这几种方式,新建线程都是在类外,然后通过把友元函数或者成员函数作为thread参数。 #include #include #include using namesp...

  • 本博文是根据中科大信息学院谭立湘老师的课件加上自己的理解整理出来的 ************************************************************************************ NVIDIA在2007年推出CUDA这个统一计算架构 CUDA的基本思想是支持大量的线程级并...

  • 一、parallel communication patterns   并行通信模式 Map:映射,在特定的位置读取和写入。 Gather:收集,从多个不同的位置读入,写入一个位置。 Scatter:分发,写入多个位置。 Transpose转置 结构数组缩写为AOS,数组结构缩写为SOA 转置运算是指任务重新排序内存中的数...