【Java多线程】快速入门Java的并发机制

Unity3D 2022版如何一键安装Newtonsoft.Json?最新Package Manager教程 本文详细介绍了在Unity3D 2022及以上版本中,如何通过Package Manager一键安装和配置Newtonsoft.Json(Json.NET)。教程涵盖了从打开Package Manager、搜索并安装正确包源,到验证安装和基础使用的完整流程,旨在帮助开发者以现代化、可靠的方式集成这一强大的JSON处理框架,提升开发效率并规避手动导入的常见问题。 阅读详情

从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。–Wikipedia


程序、进程、线程

程序: 是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中。

进程诞生背景:
1,在多道程序环境下,允许多个程序并发执行,此时它们将失去封闭性,并具有间断性及不可再现性的特征。
2,为此引入了进程(Process)的概念,以便更好地描述和控制程序的并发执行,实现操作系统的并发性和共享性。

进程的定义为:

  • 进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
  • 它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如 CPU 时间,内存空间,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。

线程诞生背景:
1,引入进程的目的,是为了使多道程序并发执行,以提高资源利用率和系统吞吐量;
2,而引入线程,则是为了减小程序在并发执行时所付出的时空开销,提高操作系统的并发性能。

线程的定义为:

  1. 与进程相似,但线程是一个比进程更小的执行单位。
  2. 一个进程在其执行的过程中可以产生多个线程。
  3. 与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

理解:
1,你的公司这个整体是个操作系统;
2,公司有多个部门,一个部门下有多个小组,每个小组是一个进程;
3,每个小组下有多个成员,每个成员就是一个线程;
4,当一个项目A下来的时候,公司把A项目拿个你所在技术部的第一小组做;
5,小组就是一个进程,小组中的每个成员就是一个线程。


Java的多线程机制

Java实现多线程机制的方式:

  1. java.lang.Thread类实现
  2. java.lang.Runnable接口实现
  3. java.util.concurrent.Callable接口实现

注意:
每个线程,都有自己的名字。main方法作为主线程,线程名就是“main”,其他新建线程也有名字,默认是“Thread-0”,“Thread-1”类此递增。

Thread类实现多线程

操作步骤:

  1. 自定义一个类继承Thread类。
  2. 重写Thread类的run方法,把自定义线程的任务代码写在run方法上。
  3. 创建Thread的子类对象,并且调用start方法启动一个线程。
  4. 注意:千万不要直接调用run方法,调用start方法的时候线程就会开启,线程一旦开启就会执行run方法中代码,如果直接调用run方法,那么就 相当于调用了一个普通的方法而已。

类方法:

  1. String getName(); 获取线程名字
  2. static Thread currentThread(); 在main线程中执行,返回CPU当前正在执行的线程名
  3. static void sleep(毫秒数); 线程运行到此代码时,睡眠了一定的毫秒数后再执行

第一个Thread类继承实现的多线程:

public class Main {
	public static void main(String[] args) {
		//创建第一个线程实例
		MyThread mt = new MyThread();
		// 修改线程名字
		mt.setName("第一个线程运行");
		// 启动线程
		mt.start(); //告诉系统创建一个独立的线程来运行这个实例中的run方法

		// 创建第二个线程实例
		MyThread mt2 = new MyThread();
		mt2.setName("第二个线程运行");
		// 启动线程
		mt2.start(); //告诉系统又创建一个独立的线程来运行这个实例中的run方法
	}
}
class MyThread extends Thread {
	@Override
	public void run() {//
		for (int i = 0; i < 5; i++) {
			System.out.println(getName() + ":" + i);
		}
	}
}
//注意:每次运行的结果都是不一样的

Thread构造器:

  1. Thread(String name) 创建线程类时就赋值名字(需要给线程类写一个有参构造器,调用Thread类的构造方法)
  2. Thread(Runnable target) 包装Runnable对象(线程任务类)
  3. Thread(Runnable target, String) 包装线程任务类,并初始化线程名字

获取:

  1. String getName(); 获取线程名字
  2. void setName(); 设置线程名字。注意设置名字的操作应该在调用start方法之前。
  3. long getId(); 获取线程ID
  4. Thread.state getState(); 获取线程状态,Java 中线程状态是用 6 个 enum 表示,分别为:NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED
  5. static Thread currentThread(); 返回对当前正在执行的线程对象的引用。这个代码在哪个线程中,就得到哪个线程对象。
    System.out.println(Thread.currentThread().getName()); 输出当前正在运行线程的名
    每个线程,都有自己的名字。main方法作为主线程,线程名就是“main”,其他新建线程也有名字,默认是“Thread-0”,“Thread-1”类此递增。

判定:

  1. boolean isInterrupted(); 判断是否被打断
  2. boolean isAlive(); 判断是否还存活

休眠:

  1. public static void sleep(long millis) throws InterruptedException
  2. public static void sleep(long millis, int nanos) throws InterruptedException
  • 注意:调用sleep方法会进入计时等待状态,等时间到了,进入的是就绪状态而并非是运行状态!

Runnable接口实现

操作步骤:

  1. 自定义一个类实现Runnable接口。
  2. 实现Runnable接口 的run方法,把自定义线程的任务定义在run方法上。
  3. 创建Runnable实现类对象。
  4. 创建Thread类的对象,并且把Runnable实现类的对象作为实参传递。
  5. 调用Thread对象 的start方法开启一个线程。

Runnable只有一个方法: void run();

第一个Runnable接口实现的多线程:

public class Main {
	public static void main(String[] args) {
		//创建线程实例
		MyThread mt = new MyThread();
		Thread t = new Thread(mt);
		// 修改线程名字
		t.setName("张三");
		// 启动线程
		t.start();

		// 创建线程实例
		MyThread mt2 = new MyThread();
		Thread t2 = new Thread(mt2);
		t2.setName("老王");
		// 启动线程
		t2.start();
	}
}
class MyThread implements Runnable {
	@Override
	public void run() {
		for (int i = 0; i < 5; i++) {
			System.out.println(Thread.currentThread().getName() + ":" + i);
		}
	}
}

Callable接口实现

背景:

  • Thread类、Runnable接口实现线程,都不能向外抛出异常、值返回
  • 要实现线程执行后有返回值、异常的则用Callable

实现步骤:

  1. 定义一个线程任务类实现Callable接口,申明线程执行的结果类型。
  2. 重写线程任务类的call方法,这个方法可以直接返回执行的结果。
  3. 创建一个Callable线程任务对象。
  4. 把Callable任务对象包装成一个未来任务(FutureTask)对象。FutureTask可以在线程执行完毕后取得到执行结果。注意FutureTask的本质就是Runnable,便于被Thread包装。
  5. 将FutureTask对象放入Thread。
//第一个Callable接口实现实例
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

public class Main {
    public static void main(String[] args) {
        //3.创建线程任务对象
        Callable callable = new MyCallable();
        //4.把Callable包装成未来任务对象
        FutureTask<String> futureTask = new FutureTask<>(callable);
        //5.放入Thread类创建线程对象
        Thread t01 = new Thread(futureTask, "Callable线程实例01");
        t01.start();

        for(int i=0;i<5;i++) {
            System.out.println(Thread.currentThread().getName()+"==>"+i);
        }

        //在最后去获取线程执行的结果。如果该线程没有结果,则让出CPU等线程执行完再取结果
        try {
            String rs = futureTask.get(); // 获取call方法返回的结果(正常/异常结果)
            System.out.println(rs);
        }  catch (Exception e) {
            e.printStackTrace();
        }
    }
    /*
        输出样例:
        Callable线程实例01==>0
        Callable线程实例01==>1
        Callable线程实例01==>2
        Callable线程实例01==>3
        Callable线程实例01==>4
        main==>0
        main==>1
        main==>2
        main==>3
        main==>4
        Callable线程实例01线程结果值为:500

        Process finished with exit code 0
     */
}

//1.定义线程任务类
class MyCallable implements Callable<String> {

    //2.重写线程任务执行体
    @Override
    public String call() throws Exception {
        int sum = 0;
        for(int i=0; i<5;i++) {
            System.out.println(Thread.currentThread().getName() + "==>"+i);
            sum += 100;
        }
        return Thread.currentThread().getName()+"线程结果值为:"+sum;
    }
}

类实现和接口实现的区别

问题:为什么需要定一个类去实现Runnable接口呢?继承Thread类和实现Runnable接口有啥区别呢?
解答:

  1. 实现Runnable接口,避免了继承Thread类的单继承局限性。覆盖Runnable接口中的run方法,将线程任务代码定义到run方法中。
  2. 创建Thread类的对象,只有创建Thread类的对象才可以创建线程。
  3. 线程任务已被封装到Runnable接口的run方法中,而这个run方法所属于Runnable接口的子类对象,所以将这个子类对象作为参数传递给Thread的构造函数,这样,线程对象创建时就可以明确要运行的线程的任务。

匿名内部类实现多线程

public class Main {
	public static void main(String[] args) {
		//继承方式  XXX extends Thread{ public void run(){}}
		new Thread() {
			public void run() {
				System.out.println("!!!");
			}
		}.start();

		// 实现接口方式 XXX implements Runnable{ public void run(){}}
		Runnable r = new Runnable() {
			public void run() {
				System.out.println("###");
			}
		};
		new Thread(r).start();

		//简写法
		new Thread(new Runnable() {
			public void run() {
				System.out.println("@@@");
			}
		}).start();
	}
}

线程特性

线程状态

根据Thread.State的静态内部类枚举,线程分为六种状态:

  • NEW状态:线程被构建。执行了new后的状态。
  • RUNNABLE状态:可运行状态,Java将操作系统中的线程就绪和运行两种状态统称为“运行中”。执行了st- 法后的状态。
  • BLOCKED状态:阻塞状态。
  • WAITING状态:等待状态。表名当前线程需要等待其他线程做出一些特定的动作(通知或者中断)以后才-
  • TIME_WAITING状态:超时等待状态。不同于WATING,它可以在指定的事件内自行返回。
  • TERMINATED状态:终止状态。
    在这里插入图片描述
    线程状态间的转换:
    在这里插入图片描述
    线程的上下文切换:
  • 多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。
  • 当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文切换。
  • 概括来说,当前任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态,以便下次再切换回这个任务时,可以再加载这个任务的状态。任务从保存到再加载的过程就是一次上下文切换。

如何获取线程状态

public class Hello {
	public static void main(String[] args) {
		MyThread mth = new MyThread();
		
		Thread th = new Thread(mth); //线程0
		System.out.println(th.getState()); //执行过new以后,线程的状态就为NEW
		
		th.start();
		System.out.println(th.getState());
		
	}
}

class MyThread implements Runnable {
	@Override
	public void run() {
		System.out.println("启动线程:"+Thread.currentThread().getName());
	}
}

停止线程

停止线程的思想方法:
A. 标志位法
B. Thread类的stop方法(已过时,禁止使用!)
C.抛异常法
D.线程中段法(见下文)

核心要点:

  1. 不要使用stop或者destroy等过时方法
  2. 不建议在run方法中使用死循环,可以利用次数
  3. 建议使用标志位来停止线程

设置一个标志位,停止线程

public class Hello {

	public static void main(String[] args) {
		MyThread mth = new MyThread();
		Thread th0 = new Thread(mth); //线程0
		
		th0.start();
		//让线程th0运行3秒钟,自动停止
		try {
			Thread.sleep(3000);
		} catch(InterruptedException e) {
			e.printStackTrace();
		}
		mth.stopCurrentThread();
	}
}


class MyThread implements Runnable {
	//volatile修饰符用来保证其它线程读取的总是该变量的最新的值
    private volatile boolean exitFlag = false; 

    public void stopCurrentThread() {
    	exitFlag = true;
    }
    
	@Override
	public void run() {
		while(!exitFlag) {
			System.out.println("线程:"+Thread.currentThread().getName()+"正在运行...");
		}
		System.out.println("线程:"+Thread.currentThread().getName()+"停止运行");
	}
}

中断线程

  • void interrupt(); 中断此线程。
  • static boolean interrupted(); 检查当前线程是否被中断,重置当前线程的中断状态为false;
  • boolean isInterrupted(); 检查某线程是否已经中断。
线程中断来停止线程

public class Hello {

	public static void main(String[] args) {
		MyThread mth = new MyThread();
		Thread th0 = new Thread(mth); //线程0
		
		th0.start();
		//让线程th0运行3秒钟,自动停止
		try {
			Thread.sleep(3000);
		} catch(InterruptedException e) {
			e.printStackTrace();
		}
		th0.interrupt(); //向th0线程发送终止通知
	}
}


class MyThread implements Runnable {
	@Override
	public void run() {
		while(!Thread.interrupted()) {
			System.out.println("线程:"+Thread.currentThread().getName()+"正在运行...");
		}
		System.out.println("线程:"+Thread.currentThread().getName()+"停止运行");
	}
}

守护线程

什么是守护线程:

  • 唯一的用途是为其他线程提供服务;
  • 当之神下守护线程时,JVM就退出了;

Boolean isDaemon(); 检查此线程是否为守护线程。
void setDaemon(Boolean isDaemon); 设定该线程为守护线程

守护线程用法
public class Hello {

	public static void main(String[] args) {
		MyThread mth = new MyThread();
		Thread th0 = new Thread(mth); //线程0
		Thread th1 = new Thread(mth); //线程1
		
		th0.start();
		System.out.println("th0是守护线程?"+th0.isDaemon());
		
		th1.setDaemon(true); //先设置为守护线程,再启动
		th1.start();
		System.out.println("th1是守护线程?"+th1.isDaemon());
	}
}

class MyThread implements Runnable {
	@Override
	public void run() {
		System.out.println("我是线程:" + Thread.currentThread().getName());
	}
}

优先级

操作方法(java.lang.Thread类):

  1. void setPriority(int newPriority); 设置此线程的优先级
  2. void getPriority(); 返回此线程的优先级

可选值:

  • static int MAX_PRIORITY 线程可以具有的最大优先级。
  • static int MIN_PRIORITY 线程可以具有的最低优先级。
  • static int NORM_PRIORITY 分配给线程的默认优先级。

数字越大,优先级越高:有效范围在1~10之间

线程优先级使用示例

public class Hello {
	public static void main(String[] args) {
		MyThread mth = new MyThread();
		Thread th0 = new Thread(mth); //线程0
		Thread th1 = new Thread(mth); //线程1
		
		th0.setPriority(10); //先设定优先级,再启动
		th0.start();
		System.out.println("线程th0的优先级:"+th0.getPriority());
		
		th1.setPriority(5);
		th1.start();
		System.out.println("线程th1的优先级:"+th1.getPriority());
	}
}

class MyThread implements Runnable {
	@Override
	public void run() {
		System.out.println("我是线程:" + Thread.currentThread().getName());
	}
}

一个核心问题

为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?

  1. new 一个 Thread,线程进入了新建状态;
  2. 调用 start() 方法,会启动一个线程并使线程进入了就绪状态,当分配到时间片后就可以开始运行了。
  3. start() 会执行线程的相应准备工作,然后自动执行 run() 方法的内容,这是真正的多线程工作。
  4. 而直接执行 run() 方法,会把 run 方法当成一个 main 线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作。
  5. 总结: 调用 start 方法方可启动线程并使线程进入就绪状态,而 run 方法只是 thread 的一个普通方法调用,还是在主线程里执行。

高通 Gen AI 推理扩展 (GENIE)(5):实战指南与Engine API深度解析 本文深入解析高通Gen AI推理扩展(GENIE)的Engine API核心功能与实战应用,涵盖引擎实例化、多引擎动态切换、性能调优及跨平台部署等关键技巧。通过详细代码示例和性能数据,帮助开发者高效利用GENIE进行AI推理,提升应用性能与稳定性。 阅读详情

相关推荐

别再死磕U-Net了!用PyTorch手把手教你搭建ResUnet,搞定医学图像分割(附完整代码)

本文详细介绍了如何利用PyTorch搭建ResUnet模型,通过引入残差连接解决医学图像分割中的梯度消失、特征退化和细节丢失问题。与传统U-Net相比,ResUnet在Dice系数和收敛速度上均有显著提升,特别适合处理脑部MRI等复杂医学图像。文章还提供了完整的代码实现和关键训练技巧,帮助开发者快速掌握这一先进技术。

weixin_42552637的博客 327

Java多线程的五种实现方式

Java多线程实现方式主要有三种:继承Thread类、实现Runnable接口、使用ExecutorService、Callable、Future实现有返回结果的多线程。其中前两种方式线程执行完后都没有返回值,只有最后一种是带返回值的。 一、第一种方式:继承Thread类 万物皆对象,那么线程也是对象,对象就应该能够抽取其公共特性封装成为类,使用类可以实例化多个对象,那么实现线程的第一种方式就是继...

riemann_的博客 1610

UNITY2022 Cardboard环境搭建

必须安装 Git,并且 git 可执行文件必须位于 PATH 环境变量中。考文档:https://developers.google.cn/cardboard/develop/unity/quickstart?转到 Assets/Samples/Google Cardboard//Hello Cardboard/Scenes/HelloCardboard 场景中。粘贴https://github.com/googlevr/cardboard-xr-plugin.git到文本输入字段中。

weixin_39510925的博客 1210

java实现多线程的四种方式

线程概念、多线程四种实现方式

zbq1017的博客 2432

Qt开发中彻底解决中文乱码问题

中文乱码问题主要源于编码不一致需要同时设置控制台和Qt应用程序的编码确保项目文件和环境配置的编码一致文件操作时注意指定正确的编码。

qq_53832058的博客 3404

【GAMES201学习笔记】物质点法入门

《GAMES201》 学习笔记

捕鱼维的个人小站 9199

Java多线程【三种实现方法】

java多线程 并发与并行 并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行 并行:一组程序按独立异步的速度执行,无论从微观还是宏观,程序都是一起执行的。 对比:并发是指:在同一个时间段内,两个或多个程序执行,有时间上的重叠(宏观上是同时,微观上仍是顺序执行) 进程与线程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作

HongYu012的博客 5065

AutoSAR配置与实践(实践篇)11.1 如何通过IPDU分组控制报文收发

注意这个新增的action其实是一个用户回调函数,在函数中进行配置字的判断,即可完成用户条件的判断(TRUE/FALSE),注意用户条件是用户封装的函数,用于输入给后续的逻辑判断和rule。进行PDU的拆分后,根据配置字可以选择PDU是否使能了。PDU组拆分后可分为常规PDU组和可配PDU组(新增),诊断一方面按原有逻辑控制常规PDU组,另一方面控制新的可配PDU组。举例说明,诊断场景:使能,配置字满足,则用户条件为TURE,表示期望使能可配PDU组(诊断禁止服务场景类似方式,在此不再列举)。

nihaoljq2010的博客 833

线程池工作机制与原理

书接上文,Java线程池。 接下来记录一下线程池的工作机制和原理线程池的两个核心队列: - 线程等待池,即线程队列BlockingQueue。 - 任务处理池(PoolWorker),即正在工作的Thread列表(HashSet)。线程池的核心参数: - 核心池大小(corePoolSize),即固定大小,设定好之后,线程池的稳定峰值,达到这个值之后池的线程数大小不会释放。 - 最大处理线

凌小星的专栏 6464

从地方政府网站抓取政务公开数据:Python爬虫技术详解

在本文中,我们通过具体实例介绍了如何使用Python编写爬虫,从地方政府门户网站抓取政务公开数据。我们使用了requestsSelenium等最新技术,结合SQLite数据库存储抓取的数据,最后使用matplotlib进行数据可视化分析。通过本项目,您可以掌握如何抓取政府网站的公开数据,并将其进行清洗、存储和分析。这些技术对于进行政府政策分析、公共服务分析等方面具有重要的实际意义。希望通过本文的介绍,您能够更好地理解政务数据抓取的流程和方法,并能在实际工作中运用这些技术进行数据采集和分析。

2201_76125261的博客 1701

RK3576 调试ov2735 mipi-csi摄像头

摘要:本文记录了基于RK3576平台调试OV2735 MIPI摄像头的全过程。开发环境采用Linux 6.1内核和Buildroot文件系统。调试步骤包括:1)硬件检查(电源、晶振和引脚连接);2)驱动配置(设备树节点、ISP通道设置);3)驱动验证(通过ID检测和I2C工具测试);4)推流测试(使用v4l2和gstreamer工具)。重点解决了复位引脚配置、时钟命名匹配等关键问题,并通过寄存器检查确保初始化正常。最终实现了摄像头数据流的成功输出,为嵌入式视觉应用开发提供了完整参考方案。

qq_45147279的博客 1060

java基础之线程(重点)

一、线程与进程 (一)进程产生的原因: 由于cpu与其他pc资源(RAM,显卡、光驱、键盘等)之间速度的不协调,为了提高资源利用率,提出了多任务系统,得益于cpu的计算速度,实质上是多个任务轮流使用cpu资源,由于速度很快,感觉是同时进行的。 任务执行需要具备执行环境,即程序执行所需的各种pc资源(显卡、RAM等),将其称之为程序上下文,要实现程序可以同时执行,就需要不断轮换,为了从当前状态...

qq30211478的博客 421

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

多线程并发简单例子

package ThreadTest.Day1; /** * @author CCQ * 线程不安全问题,多个线程同时操作一个对象。并发问题 */ public class test05 { public static void main(String[] args) { buyticket b =new buyticket(); new Thread(b,"棋棋").start(); new Thread(b,"瑶瑶").start();

CCQDDQ的博客 474

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

JUC快速入门(彻底搞懂JUC)

java JUC

抽象的螺旋 351

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

java多线程系列-----1.多线程快速入门,线程安全,多线程之间通讯,并发包,并发队列,线程池原理,锁的深度化

一. 多线程快速入门 一.1.面试题 一.2.多线程创建方式 一.3.多线程运行状态 一.4.jion()和Yield() 二. 多线程线程安全 二.1.什么是线程安全,线程安全的解决办法,死锁 二.2.多线程三大特性 二.3.Java内存模型 二.4. Volatile和ThreadLocal 三. 多线程之间通讯 三.1.多线程之间如何实现通讯 三.2.wait()、notify、n...

瓶子的博客 668

Java多线程并发从入门到进阶全解析

多线程并发,事关你我他。

码刀攻城 863

并发编程系列(一) -多线程技术快速入门

在很多场景下,我们经常听到采用多线程编程,能显著的提升程序的执行效率。例如执行大批量数据的插入操作,采用单线程编程进行插入可能需要 30 分钟,采用多线程编程进行插入可能只需要 5 分钟就够了。 既然多线程编程技术如此厉害,那什么是多线程呢? 在介绍多线程之前,我们还得先讲讲进程和线程的概念。

程序员志哥的博客 1002

并发编程(一)——多线程快速入门

线程与进程区别       每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。       使用线程可以把占据时间长的程序中的任务放到后台去处理,程序的运行速度可能加快,在一些等

哈士奇 2695

Java多线程调试技巧:10个方法帮你快速定位并发问题

Java多线程调试是每个开发者必须掌握的终极技能!😊 在并发编程中,线程安全问题、死锁、内存泄漏等bug往往难以复现和定位。本文将为你提供10个实用的Java多线程调试技巧,帮助你在复杂的并发环境中快速定位和解决问题。 ## 🎯 理解线程状态转换 [![Java线程状态转换](https://raw.gitcode.com/gh_mirrors/co/concurrent/raw/91b8

gitblog_00711的博客 880

java快速入门

Java 集合框架主要由两大接口派生而出:Collection 和 Map。Collection 接口用于存储单个元素,而 Map 接口用于存储键值对。集合框架提供了统一的接口和方法,方便开发者对不同类型的集合进行操作,同时也提高了代码的可复用性和可维护性。

m0_74013450的博客 1422

Java多线程快速入门

趁着最近课少,复习一下Java多线程相关知识,顺便发一下以前的笔记

热爱编程、热爱生活、热爱探索 936

【Java多线程并发编程实战指南:从入门到精通】

本文深入探讨Java多线程编程的核心概念与实践方法。通过对比单线程和多线程执行效率,展示多线程如何将任务执行时间从6秒缩短至3秒,提升50%效率。文章详细介绍了创建线程的四种方式:继承Thread类、实现Runnable接口(推荐)、实现Callable接口(支持返回值)以及使用FutureTask。每种方式均提供完整代码示例,包括线程初始化、任务定义和结果获取等关键环节。这些内容为Java开发者掌握并发编程提供了实用指导,帮助优化程序性能并解决实际开发中的效率问题。

想学后端的前端程序员的博客 1233

Java多线程百万数据快速入库实战

出自: 腾讯课堂 700多分钟干货实战Java多线程高并发高性能实战全集 , 我学习完了之后,我做了个笔记. 背景 某应用程序(单台服务器,非分布式的多台服务器),这单台服务器就是你的笔记本电脑了, ​ 并发产生100万条数据,这100w条数据是你自己产生的,假设你是架构师,如何运用多线程等基础知识将这100万条数据,快速同步(4分钟以内)到MySQL数据库? ​ 分析百万数据快速入库的特点 1.百万数据快速入库的特点: 数据量比较大(高并发),时间很短(性能), 100万条数据如果一条一条的插入到

张俊杰 的博客 1万+

并发编程入门(一):多线程基础

本文是《Java并发视频入门》视频课程的笔记总结,旨在帮助更多同学入门并发编程。本系列共五篇博客,本篇博客着重聊多线程基础。

云瀚的自习室 1179

java 多线程 并发 处理 大文件

坚持打卡! 这个主要实现的是,多线程处理大文件,这里的大文件指的是好几十M的文件,例如我下边写的处理几百万条数据,对他们进行过滤,得到想要的数据并输出到指定的文件中。 一开始走了不少弯路,我现在讲一下我的主要实现的思路(这里也参考了很多大佬们的意见),当自己写出来的时候才是属于自己的。 主要思路: 1,创建线程池,其多个线程。去并发的读取同一个文件 2,我这里线程的实现是通过实现Call...

陈三一的博客 3993

JAVA多线程入门:5个简单实例快速上手

因为Java是单继承的,使用接口可以避免继承限制。一个线程可以调用wait方法释放锁并进入等待状态,另一个线程通过notify或notifyAll来唤醒等待的线程。这个例子展示了如何使用固定大小的线程池来执行多个任务,避免了频繁创建和销毁线程的开销。在run方法中编写线程要执行的代码,然后调用start方法启动线程。最方便的是,写完的多线程程序可以直接一键部署运行,不需要自己搭建复杂的开发环境。对于新手来说,多线程编程确实有些抽象,但通过这样循序渐进的实例练习,配合即时可见的运行效果,理解起来就容易多了。

SilvermistRaven28的博客 490
上一篇: 【Java文件流】你的“转换流、对象流、打印流、Properites”学习资料
下一篇: 【Java多线程】多线程同步——对“synchronized”关键字的简单理解
ALGO阿狗
博客等级 码龄9年 64粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值