Java 多线程编程

JAVA编程【多线程编程】 线程创建:可以通过继承 Thread 类或者实现 Runnable 接口来创建线程。线程同步:可以通过 synchronized 关键字或者 ReentrantLock 来确保线程安全。线程池:通过 ExecutorService 来管理线程池,提高性能。 阅读详情

多线程在软件开发中用得很多,现在几乎所有的软件都用到了多线程,如:QQ、迅雷、eclipe集成开发环境等。

什么是多线程?

当一个程序启动后就是一个进程,可以理解进程就是CPU的一个执行流程,而多线程就是在一个进程内执行多个线程,相当于在一个执行流程内开辟多个

执行序列,举个例子:一个服务员每天要做端菜、洗碗、拖地等事情,每件事情可以理解为一个执行流程,让他开始洗碗那么他必须要把碗洗完了才能做其他的事情(流程),这样效率就很低,如果在他正在洗碗的时候能够做其它事情那么就很高效了,如他正在洗碗,这时让他去端菜,那就暂时停止洗碗去端菜,菜端完了继续洗碗。

 

时间片:

简单理解就是分配给线程的执行时间,实际上线程在微观上是串行执行的,也就是一个个执行,但是系统给每个线程都分配的执行时间,

如:

线程1 分配10ms的执行时间

线程2 分配10ms的执行时间

由于时间很短给人的感觉就是多个线程在一起执行。

 

线程的生命周期:

一个线程从创建、启动、结束有几种状态。

1.新建   线程已经准备就绪还没启动

2.运行 线程正在执行(在分配的时间内)

3.阻塞  线程已经启动但没有获得执行时间而处于等待队列中

4.结束 线程已经执行完毕并释放相关资源

 

Java实现多线程的3种方式:

1.让一个需要实现线程操作的类继承至Thread类,并重写父类的run方法

2.让一个需要实现线程操作的类实现Runnable接口

3.使用Timer和TimerTask组合

 

第一种实现方法:

package mypackage;
/**
 * 继承至Thread类使能够执行线程
 * @author dream
 *
 */
public class MyThread extends Thread
{
	
	
	public static void main(String[] args)
	{
		MyThread myth=new MyThread();
		myth.start();
		System.out.println("主线程");
	}
	
	
	
	//线程的调用run方法执行
	public void run()
	{
		int n=10;
		while(true)
		{
			if(n>0)
			{
				try
				{
					System.out.println(n);
					n--;
					Thread.sleep(1000);
				}
				catch(Exception ex)
				{
					
				}
			}
		}
	}
}


第二种实现方法:

package mypackage;

/**
 * 实现Runnable接口执行线程操作
 * @author dream
 *
 */
public class MyThread1 implements Runnable
{
	public static void main(String[] args)
	{
		MyThread myth=new MyThread();
		myth.start();
		System.out.println("主线程");
	}
	public void run()
	{
		int n=10;
		while(true)
		{
			if(n>0)
			{
				try
				{
					System.out.println(n);
					n--;
					Thread.sleep(1000);
				}
				catch(Exception ex)
				{
					
				}
			}
		}
	}
}


第三种实现方法:

package mypackage;

import java.util.Timer;
import java.util.TimerTask;

public class MyThread2 extends TimerTask
{
	public static void main(String[] args)
	{
		MyThread2 myth=new MyThread2();
		Timer timer=new Timer();
		timer.schedule(myth, 0);//启动线程
		System.out.println("主线程");
	}
	
	public void run()
	{
		int n=10;
		while(true)
		{
			if(n>0)
			{
				try
				{
					System.out.println(n);
					n--;
					Thread.sleep(1000);
				}
				catch(Exception ex)
				{
					
				}
			}
		}
	}
}


多线程遇到的问题及处理:

多线程虽然能够使软件高效运行,但用得不好会带来负面效果

如一个变量a=10,同时启动3个线程来读取它的值,每读取一次则值减一,这就有一个问题,3个线程在各自的时间段里执行,但操作的变量a是共有的

线程1 使a的值减一 正常情况应该a=9了,如果线程2已经使a减一了那么这就会出问题了。

下面是一段有问题的代码:

//---------threaddemo.java
package mypackage;

public class threaddemo
{
	public int money=20;
}

//OpeatorMoney.java
package mypackage;

public class OpeatorMoney extends Thread
{
   threaddemo demo;
   private String threadname;
   public OpeatorMoney(threaddemo demo1,String name)
   {
	   this.demo=demo1;
	   this.threadname=name;
   }
   public void run()
   {
	   while(true)
	   {
		   try
		   {
			   if(demo.money>0)
			   {
				   System.out.println("线程:"+this.threadname+"---"+demo.money);
				   demo.money--;
				   
			   }
			   else
			   {
				   break;
			   }
		   }
		   catch(Exception ex){}
	   }
   }
}

//ThreadTest.java
package demo1;

import java.util.Timer;

import mypackage.*;

public class ThreadTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{

		
		threaddemo demo=new threaddemo();
		OpeatorMoney opm1=new OpeatorMoney(demo, "线程1");
		OpeatorMoney opm2=new OpeatorMoney(demo, "线程2");
		OpeatorMoney opm3=new OpeatorMoney(demo, "线程3");
		
		opm1.start();
		opm2.start();
		opm3.start();
		
		
		
	}
	
	private static void Show(String msg)
	{
		System.out.println(msg);
	}

}


这段代码会输出:

线程:线程1---20
线程:线程2---20
线程:线程2---19
线程:线程1---18
线程:线程1---16
线程:线程1---15
线程:线程1---14
线程:线程1---13
线程:线程1---12
线程:线程1---11
线程:线程1---10
线程:线程1---9
线程:线程1---8
线程:线程1---7
线程:线程1---6
线程:线程1---5
线程:线程1---4
线程:线程1---3
线程:线程1---2
线程:线程1---1
线程:线程3---17
线程:线程2---17

这显然是有问题的,可以通过互斥解决这个问题,也就是当一个线程正在操作这个代码的时候其它线程必须等待:

一个案例代码:

//----Account.java
package mypackage;

/**
 * 模拟银行帐号的类
 * @author dream
 *
 */
public class Account 
{
	int money=0;//账户余额
	
	//取钱
	public synchronized void GetMoney()
	{
		System.out.println("准备取钱....");
		try
		{
			//检查是否有钱
			if(this.money==0)
			{
				wait();//账户没钱等待家长存钱
			}
			
			money=money-50;
			System.out.println("剩余:"+this.money);
			notify();//通知家长存钱
		}
		catch(Exception ex){}
	}
	
	//存钱
	public synchronized void SetMoney()
	{
		try
		{
			System.out.println("准备取钱....");
			if(this.money!=0)
			{
				wait();//如果孩子账户还有钱,则等待
			}
			
			money=200;
			System.out.println("存入"+this.money);
			notify();//通知孩子取钱
			
		}
		catch(Exception ex){}
	}
}

//----Parent.java
package mypackage;

/**
 * 模拟家长的类
 * @author dream
 *
 */
public class Parent extends Thread
{
	private Account account;
	
	public Parent(Account a)
	{
		this.account=a;
		start();
	}
	
	public void run()
	{
		try
		{
			while(true)
			{
				Thread.sleep(10000);
				this.account.SetMoney();
			}
		}
		catch(Exception ex){}
	}
}

//-----ThreadTest.java
package demo1;
import java.util.Timer;
import mypackage.*;

public class ThreadTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) 
	{

		Account a=new Account();
		Parent p1=new Parent(a);
		Student stu1=new Student(a);

	}
	
	private static void Show(String msg)
	{
		System.out.println(msg);
	}

}


 

输出:

 

Java多线程编程详解 本文系统介绍了Java多线程编程的核心内容,包括线程创建方式(继承Thread类、实现Runnable/Callable接口、线程池)、生命周期管理、同步机制(synchronized、Lock、volatile、原子类)以及常用并发工具类(CountDownLatch、CyclicBarrier、Semaphore)。通过代码示例展示了各种多线程技术的实际应用,帮助开发者理解并发编程的关键概念和技术实现。文章涵盖从基础到进阶的多线程知识,为Java开发者提供了全面的并发编程指导。 阅读详情

相关推荐

L298N电机驱动模块的接线使用与代码实现

#include "iostm8s208mb.h" #define u8 uint8_t #define u16 uint16_t #define u32 uint32_t typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned long uint32_t; // 关于LED灯的宏定义 #define LED2 PI_ODR_ODR2 //输出量 #define LE

Clichong 13万+

new Thread线程和main主线程的执行顺序,小小的面试题,不可大意

package test; public class ThreadTest { public static void main(String[] args) { System.out.println("[main] execute"); MyThread myThread = new MyThread(); myThread.start(); } } class MyThre...

Trainer2107的博客 7378

ROS2机械臂MPC轨迹规划实战:从MoveIt 2插件配置到参数调优全流程

本文详细介绍了ROS2机械臂MPC轨迹规划的全流程,从MoveIt 2插件配置到参数调优。通过模型预测控制(MPC)技术,实现高精度运动控制,特别适合复杂装配任务。文章包含环境搭建、插件部署、参数设计及实战调优方法,帮助开发者快速掌握ROS2机械臂的MPC轨迹规划技术。

i0j1k2l3m的博客 206

JAVA多线程编程

JAVA的背景和历史JAVA的特点和应用领域如何安装和配置JAVA开发环境。

Kali与编程 1018

手把手教你用EGM96模型校正DEM数据(含在线工具推荐)

本文详细介绍了如何使用EGM96地球重力场模型校正DEM数据中的高程偏差。通过对比WGS84椭球面与大地水准面的差异,解释了校正原理,并提供了从在线工具快速验证到Python脚本批量处理的全流程实战指南,帮助GIS开发者和数据分析师确保高程数据基准一致,提升空间分析精度。

ttt77的博客 1007

示波器面板上的隐藏功能:如何利用BW Limit和EXT TRIG提升测量精度

本文深入探讨示波器面板上的隐藏功能BW Limit和EXT TRIG,揭示它们如何提升测量精度。通过带宽限制(BW Limit)有效滤除高频噪声,结合外部触发(EXT TRIG)确保稳定信号捕获,为电子测量提供专业解决方案。特别适用于开关电源、传感器信号等复杂场景的高精度测量需求。

weixin_30300225的博客 518

java多线程编程

多线程简介 对多线程的理解 1. 多任务与多线程    多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。 2. 多线程例子(生活,游戏,编程) 边吃饭边玩手机,边听歌边写作业 开黑打游戏 等等 3. 进程,程序,线程的理解 进程: 是程序的一次执行,是动态的,一个进程至少包含一个线程,一个线程不能独立存在,它必须是进程的一部分;一个进程一直运行,直到所有非守护线程都结束运行后才能结束。 程序是代码段,是静态的。 一条线程指的是进程中一个单一顺序的控制流,一

qq_44045519的博客 1296

【BlueDroid】蓝牙音乐协议分析之A2DP和AVRCP连接流程(超详细)

AVCTP协议描述了蓝牙设备间Audio/Video的控制信号交换的格式和机制,他是一个总体的协议,具体的控制信息由其指定的协议(AVRCP)实现,AVCTP协议本身只指定控制Command和Response的总体的格式;这个过程中对应了Event中的btavrcp_play_status_changed_callback和btavrcp_play_position_changed_callback;上述为AVCTP-Control建立L2CAP连接的Command,对应H4的Sent (0x00);

风云说通信 7314

【Java 基础篇】Java多线程编程详解

本文详细介绍了Java多线程编程的概念、原理和常用技术。多线程编程可以提高程序的性能和响应能力,但也需要注意线程安全和线程同步的问题。在实际开发中,合理地使用多线程可以充分发挥多核处理器的优势,提高程序的并发能力和执行效率。同时,需要注意避免多线程之间的竞争条件和数据一致性问题,保证线程的安全性和正确性。希望本文对你理解和应用Java多线程编程有所帮助!

繁依Fanyi的博客 3110

Python 爬虫实战:付费 IP 代理使用技巧与爬虫稳定性优化

付费IP代理实战指南:突破反爬与优化稳定性 本文系统讲解付费IP代理在爬虫项目中的高效应用方法。首先对比分析静态代理、动态代理和隧道代理的优缺点及适用场景,推荐高并发项目优先选择隧道代理。然后详细演示了主流代理服务商的集成方法,包括代理池的自动更新和健康检测机制。核心部分重点介绍了爬虫稳定性优化策略,如智能重试、频率控制和请求间隔优化等关键技术。最后通过压力测试验证优化效果,并提供成本控制方案,包括代理复用、错峰爬取等实用技巧。通过本教程,开发者可有效解决高并发爬虫中的IP封禁问题,显著提升系统稳定性和抗风

2503_91057718的博客 2450

RK3399快速上手 | 01- 开发环境搭建(固件烧写、编译工具链安装、kernel编译)

一、编译工具链 编译工具链使用gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu。 下载地址: https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/arm-linux-gnueabihf/ wget https://releases.linaro.org/components/toolchain/binaries/6.3-2017.05/arm-linux-gnueabi

Mculover666的博客(嵌入式) 8835

多线程编程java_Java中的 多线程编程

Java 中的多线程编程一、多线程的优缺点多线程的优点:1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快多线程的代价:1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般都更复杂。在多线程访问共享数据的时候,这部分代码需要特别的注意。线程之间的交互往往非常复杂。不正确的线程同步产生的错误非常难以被发现,并且重现以修复。2)上下文切换的开销当CPU从执行一个线...

weixin_35745051的博客 100

效果炸裂_安装midscene_copw基于midscene操作电脑_基于视觉的软件测试执行_MIDSCENE的安装和使用---AI大模型应用探索0012

摘要:本文介绍了如何通过安装MidSceneJS来增强Copaw的屏幕操作能力。首先需要安装Node.js和npm,并配置淘宝镜像源加速安装。然后全局安装MidScene CLI工具(npm install @midscene/cli -g)。接着配置视觉大模型服务,通过设置环境变量指定模型API密钥、名称、基础URL和家族类型(如qwen3.5-27b),配置文件需存放在C:\Users\Administrator.copaw目录。安装成功后,MidScene已能成功识别并操作屏幕,使用效果良好。文中还提

添柴程序猿的专栏 639

Java多线程编程

守护线程是为用户线程服务的后台线程。当程序中所有用户线程都执行完毕后,守护线程会自动结束。

· 1614

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

多线程编程java_java多线程编程

在Java的 JDK 开发包中,已经自带了对多线程技术的支持,可以方便地进行多线程编程。Java 实现多线程编程的方式主要有三种:(1)通过实现 Runnable 接口;(2)通过继承 Thread 类;(3)通过 Callable 和 Future 创建线程。下面详细介绍下这三种具体实现方式。通过实现 Runnable 接口来创建线程创建线程的一种方法是,创建一个实现 Runnable 接口...

weixin_39730284的博客 162

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

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

java多线程编程有什么用_java多线程编程的作用都有哪些

我们在上文中给大家简单介绍了java多线程编程中线程与进程的基本概念和线程生命周期等技术知识,而今天我们就再来了解一下,java多线程编程的作用都有哪些。1.充分利用CPU资源现在世界上大多数计算机只有一块CPU。因此,充分利用CPU资源显得尤为重要。当执行单线程程序时,由于在程序发生阻塞时CPU可能会处于空闲状态。这将造成大量的计算资源的浪费。而在程序中使用多线程可以在某一个线程处于休眠或阻塞时...

weixin_42502040的博客 751

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java多线程编程是什么,Java多线程编程的核心是什么?

Java多线程编程的核心是什么?其实在 Java 程序中使用多线程要比在 C 或 C++ 中容易得多,这是因为 Java编程语言提供了语言级的支持。本文通过简单的编程示例来说明 Java 程序中的多线程是多么直观。读完本文以后,用户应该能够编写简单的多线程程序。为什么会排队等待?下面的这个简单的 Java 程序完成四项不相关的任务。这样的程序有单个控制线程,控制在这四个任务之间线性地移动。此外,因...

weixin_34511324的博客 122

java多线程编程_java多线程编程

所谓的多线程编程本质上是并发编程,并发编程的本质是指发挥出所有硬件的最大性能。    Java 是为数不多的真正支持有多线程并发编程的开发语言。所以Java 在整体的处理性能上是最高的。如果要了解线程的性能问题,那么首先要先解决的就是清楚什么叫做进程?从计算机发展的历史来讲,传统的硬件只有一个 CPU(单核心的CPU),于是为了发挥出硬件的全部性能,引入了多进程的编程模式。多进程是指在没有扩展原始...

weixin_31600859的博客 170

多线程Java Socket编程示例

多线程Java Socket编程示例 http://www.blogjava.net/sterning/archive/2007/10/15/152940.htmlPosted on 2007-10-15 12:37 诗特林 阅读(804) 评论(0)  编辑  收藏 所属分类: Java <!--<rdf:RDF xmlns:rdf="http://www.w3.org/1

GOBY 栏目 4122

【线程】Java多线程编程

本文详细介绍了Java中创建线程的多种方式,介绍了线程的构造方法和重要属性。

telasi2004的博客 1056
上一篇: C++中string类
下一篇: 详细介绍ORACLE sqlplus命令(转)
IT回忆录
博客等级 码龄16年 42粉丝 100原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值