多线程

【java多线程编程】三种多线程的实现方式 文章目录前言进程与线程继承Thread类,实现多线程FAQ 为什么多线程的启动不直接使用run()方法而必须使用Thread类中start()方法呢?基于Runnable接口实现多线程Thread 与 Runnable 的关系Callable实现多线程线程运行状态 前言       在java语言最大的特点是支持多线程的开发(也是为数不多... 阅读详情
多线程的第一种写法:
继承Thread类

package com.nbchina;

class Demo extends Thread{
	
	private String demoName;
	Demo(String demoName) {
		this.demoName=demoName;
	}

	public void run(){
		for(int x=0;x<60;x++)
			System.out.println(demoName+" extends Thread demo run == "+x);
	}
}


public class ThreadDemo {

	public static void main(String[] args) {
		Demo demoThread1 = new Demo("Thread1");
		Demo demoThread2 = new Demo("Thread2");
		demoThread1.start();
		demoThread2.start();
		for(int x=0;x<60;x++)
			System.out.println("main Thread++"+x);
	}

}

多线程的第二种写法:
继承接口Runnable

package com.nbchina;

class TicketDemo implements Runnable{
	private int tick=10000;
	
	public void run(){
		while(true){
			if(tick>0){
				System.out.println(Thread.currentThread().getName()+" TicketDemo sale : "+tick--);
			}
		}
	}
}


public class ThreadDemo {

	public static void main(String[] args) {
		TicketDemo t = new TicketDemo();
		Thread t1 = new Thread(t);
		Thread t2 = new Thread(t);
		t1.start();
		t2.start();

		

	}

}

通过synchronized代码酷块解决安全问题.共享变量tick,通过synchronized锁住执行代码块.

package com.nbchina;

class TicketDemo implements Runnable{
	private int tick=10000;
	
	public void run(){
		while(true){
			synchronized(TicketDemo.class){
				if(tick>0){
					System.out.println(Thread.currentThread().getName()+" TicketDemo sale : "+tick--);
				}
			}
		}
	}
}


public class ThreadDemo2 {

	public static void main(String[] args) {
		TicketDemo t = new TicketDemo();
		Thread t1 = new Thread(t);
		Thread t2 = new Thread(t);
		t1.start();
		t2.start();

		

	}

}



通过自定义方法,附加synchronized,来解决共享变量安全问题

package com.nbchina;

class TicketDemo implements Runnable{
	private static int tick=10000;
	public void run(){
		while(true){
			show();
		}
	}
	public static synchronized void show(){
		if(tick>0){
			System.out.println(Thread.currentThread().getName()+" TicketDemo2 sale : "+tick--);
		}
	}
}




public class ThreadDemo2 {
	public static void main(String[] args) {
		TicketDemo t = new TicketDemo();
		Thread t1 = new Thread(t);
		Thread t2 = new Thread(t);
		t1.start();
		t2.start();
	}

}



设计模式单例模式

class Single{//懒汉式
	private static final Single s=new Single();
	private Single(){}
	public static Single getInstance(){
		return s;
	}

}

class Single{//恶汉式
	private static Single s=null;
	private Single(){}
	public static Single getInstance(){
		if(s==null){
			synchronized(Single.class){
				if(s==null){
					s=new Single();
				}
			}
		}
		return s;
	}
}

public class SingletonTest {
	public static void main(String[] arges){
		Single single = Single.getInstance();
		Single single2 = Single.getInstance();
		System.out.print(singleton2==singleton);
	}
}



一个资源,一个生产者一个索取者,利用synchronized函数块,以及notifyAll()、Runnable互斥。程序缺点是notifyAll()需要全部唤醒我方和对方所有等待进程。所以改进在jdk1.5。使用显示锁lock

package com.nbchina;


class Resource{
	private String name;
	private int count = 1;
	private boolean flag = false;
	
	public synchronized void set(String name){
		while(flag)//注意:必须while 判断,不能if 。因为唤醒所有的等待进程,若当初等待进程再判断if之后等待,那么我方唤醒之后,我方等待的资源可能立即抢占互斥对方等待进程cpu的执行。因为不需要循环判断,那么就直接执行下面。
			try{this.wait();}catch(Exception e){}
		this.name = name+":"+count++;
		
		System.out.println(Thread.currentThread().getName()+"[生产者]"+this.name);
		flag = true;
		this.notifyAll();//唤醒对方以及我方线程
	}
	
	public synchronized void out(){
		while(!flag)
			try{this.wait();}catch(Exception e){}
		
		System.out.println(Thread.currentThread().getName()+"[消费者]"+this.name);
		flag = false;
		this.notifyAll();
	}
}

class Producer implements Runnable{
	private Resource res;
	Producer(Resource res){
		this.res=res;
	}
	public void run(){
		while(true){
			res.set("-商品");
		}
	}
}

class Consumer implements Runnable{
	private Resource res;
	Consumer(Resource res){
		this.res=res;
	}
	public void run(){
		while(true){
			res.out();
		}
	}
}

public class ThreadDemo4 {

	public static void main(String[] args) {
		Resource r = new Resource();
		Producer pro = new Producer(r);
		Consumer con = new Consumer(r);
		
		Thread t1 = new Thread(pro);
		Thread t2 = new Thread(con);
		
		t1.start();
		t2.start();
	}

}


互斥使用资源,利用jdk1.5中的lock解决方案。


package com.nbchina;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * jdk1.5提供了多线程升级解决方案.将同步Synchronized替换成Lock操作.
 * 将Object中的wait,notify notifyAll换成Condition对象.
 */
class Resource{
	private String name;
	private int count = 1;
	private boolean flag = false;
	
	private Lock lock =new ReentrantLock();
	private Condition condition_pro = lock.newCondition();
	private Condition condition_con = lock.newCondition();
	
	public void set(String name) throws InterruptedException{
		lock.lock();
		try{
			while(flag)
				condition_pro.await();
			this.name = name+":"+count++;
			
			System.out.println(Thread.currentThread().getName()+"[生产者]"+this.name);
			flag = true;
			condition_con.signal();	
		}finally{
			lock.unlock();
		}

	}
	
	public void out() throws InterruptedException{
		lock.lock();
		try{
			while(!flag)
				condition_con.await();
			System.out.println(Thread.currentThread().getName()+"[消费者]"+this.name);
			flag = false;
			condition_pro.signal();	
		}finally{
			lock.unlock();
		}

	}
}

class Producer implements Runnable{
	private Resource res;
	Producer(Resource res){
		this.res=res;
	}
	public void run(){
		while(true){
			try {
				res.set("-商品");
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

class Consumer implements Runnable{
	private Resource res;
	Consumer(Resource res){
		this.res=res;
	}
	public void run(){
		while(true){
			try {
				res.out();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

public class ThreadDemo5 {

	public static void main(String[] args) {
		Resource r = new Resource();
		Producer pro = new Producer(r);
		Consumer con = new Consumer(r);
		
		Thread t1 = new Thread(pro);
		Thread t2 = new Thread(con);
		
		t1.start();
		t2.start();
	}

}


Ruby 多线程 多线程是一种允许单个程序同时执行多个任务的技术。在传统的单线程程序中,任务通常是顺序执行的,这意味着如果一个任务需要较长时间才能完成,它会阻塞后续任务的执行。而在多线程环境中,程序可以同时运行多个线程,每个线程执行一个独立的任务,从而提高了程序的效率和响应速度。 阅读详情

相关推荐

多线程基础入门:从单线程到多线程的魔法之旅

说到多线程,大家第一印象可能就是“并发”、“并行”等词,但这些词汇的背后究竟藏着怎样的魔法?对于 Java 初学者来说,多线程就像一个复杂的迷宫,如果没有明确的方向和清晰的思路,容易被概念和代码搞得头晕眼花。这篇文章将带你逐步解锁多线程的基础,配合示例代码,力求让你在这条学习之路上不再迷茫,真正地从概念到实践掌握多线程的精髓。简单来说,多线程是一种让程序能在同一时间执行多个任务的技术。它模拟了我们人类的多任务能力,比如边听音乐边写代码。多线程编程不仅是技术的挑战,更是思维的突破。

喵手的博客 1352

Android Matrix 介绍

Matrix ,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放、平移、旋转等操作。 首先介绍一下矩阵运算。加法和减法就不用说了,太简单了,对应位相加就好。图像处理,主要用到的是乘法 。下面是一个乘法的公式: 2011-11-20 10:22:46 上传 下载附件 (3.2 KB) 在 Android 里面, Matrix 由 9

大苯熊-我的书房 2万+

SAP打印错位问题终极解决指南:LP01设备格式设置全流程

本文详细解析了SAP系统中LP01设备打印错位问题的解决方案,重点介绍了SPAD事务码的配置流程和格式设置技巧。通过精准调整输出设备、设备类型和格式类型的匹配关系,有效解决'未定义格式'错误,确保打印内容准确对齐。文章还提供了高级排查方法和预防措施,帮助SAP管理员提升打印管理效率。

weixin_29311017的博客 390

Spring2.5学习笔记 [贰]

11_用@Resource注解完成属性装配 & 12_编码剖析@Resource注解的实现原理(2009-12-30  11:20:23) 编码解析实现原理日后补充  使用Field注入(用于注解方式) 手工注入依赖对象,有两种方式。1、在配置文件中使用setter方法注入 2、使用@Autowired或@Resource注解方式,需要在配置文件中配置如下信

大苯熊-我的书房 927

超详细版risc-v五级流水线cpu硬件设计实现解析

深入剖析risc-v五级流水线cpu的硬件架构与设计细节,涵盖指令流程、模块划分与关键时序控制,帮助理解risc-v五级流水线cpu的工作机制与优化策略。

weixin_42437253的博客 1633

快乐8 Ai大模型XGBoost LightGBM预测系统

随机森林回归:通过集成多个决策树模型,提高预测的准确性和稳定性。XGBoost:一种基于梯度提升的强大模型,擅长处理结构化数据。LightGBM:一种高效的基于决策树算法的分布式梯度提升框架,具有快速的训练速度和低内存消耗。高预测准确率:通过集成多种模型,提供更为精准的预测结果。多种预测方法:支持同尾号、重号、温号、连号和综合预测等多种预测策略,满足不同用户的需求。实时日志:在预测过程中,用户可以实时查看系统的预测进度和结果。

m0_72636583的博客 1万+

Java回调以及线程综合应用实例--陆续添加

回调,这个概念不难理解。   某天,我打电话向你请教问题,当然是个难题,^_^,你一时想不出解决方法,我又不能拿着电话在那里傻等,于是我们约定:等你想出办法后打手机通知我,这样,我就挂掉电话办其它事情去了。过了XX分钟,我的手机响了,你兴高采烈的说问题已经搞定,应该如此这般处理。故事到此结束。这个例子说明了“异步+回调”的编程模式。其中,你后来打手机告诉我结果便是一个“回调”过程;我的手机号

大苯熊-我的书房 3408

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

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

i0j1k2l3m的博客 206

Heritrix-1.14.4

http://visjs.org/

大苯熊-我的书房 855

Fluent新手避坑:遇到‘Floating point exception’别慌,这7个排查步骤帮你搞定

本文为Fluent新手提供了遇到‘Floating point exception’错误时的7个详细排查步骤。从理解浮点异常的本质到边界条件检查、时间步长设置、求解器选择、网格优化、亚松弛因子调节以及高阶格式的取舍,帮助用户快速定位并解决问题,确保CFD仿真的稳定性和准确性。

weixin_30480075的博客 260

蓝牙功耗优化实战:连接蓝牙耳机时高耗电问题的深度排查与解决

连接任意一款蓝牙耳机, 进行插入实网SIM卡, 同时连接蓝牙耳机后, 进入IDLE模式, 测试时间为10分钟的测试结果, 平均电流毫安在8左右. 测试结果1: 平均电流 8.84mA 测试结果2: 平均电流 7.39mA 厘清问题: 由于出现上两幅图中 绿色线圈中的 20mA 左右高耗电时段, 从而将整体的平均电流抬高. 于是在记录IDLE下电流出现绿色线圈中的 20mA 左右高耗电时段, 同时录制UART1 Catcher log. Filter: MOD_BT/MOD_ATC.

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 1001

mavn学习笔记(未整理)

path  mvn -version http://localhost:8081/nexus NEXUS_HOME=C:\nexus-2.1.1-bundle\nexus-2.1.1 %NEXUS_HOME%\bin\jsw\windows-x86-64 把C:\apache-maven-3.1.1\conf\settings.xml拷贝到D:/Maven

大苯熊-我的书房 2212

TC3XX - MCAL知识点(十一):WDG EB-tresos配置说明与代码浅析

在AUTOSAR中,看门狗栈实现了三种监控机制:实时监控:用于周期软件的定时监控期限监督:针对非周期软件逻辑监督:用于监督执行顺序的正确性看门狗(WDG)驱动实现AUTOSAR(4.2.2)中规定的看门狗SWS,提供初始化、改变操作模式和设置触发条件(超时)等服务,供看门狗硬件(WDT)用户使用。WDG驱动的用户包括:模式管理模块(用于初始化),WdgM通过Wdglf设置触发条件和驱动运行模式设置。WdgM实施上述监督机制。AUTOSAR扩展触发概念,以支持窗口看门狗模式。

梦想技术家 3603

Arduino的多线程

前言 本章节是如何使用Arduino 的多线程技术。截止目前,Arduino 的性能很棒,但是如果我们想在不同的时间间隔中,完成两件、多件的任务呢? 此时,我们就需要使用一种类多线程技术来处理项目。 Arduino 的多线程 \ 类多线程? 为了正确理解多线程技术和Arduino 之间的关系,我们需要理解为什么它不是真正的多线程。 在计算机CPU上,多线程应用程序...

TEST_PROGRAM_NONE 3万+

基于BERTopic模型的英文20新闻数据集主题聚类及可视化

BERTopic是基于深度学习的一种主题建模方法。BERT是一种用于NLP的预训练策略,它成功地利用了句子的深层语义信息。

Cachel Wood的博客 1461

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

多线程一,什么是多线程,创建多线程的几种方式

1 多线程相关概念 并发(Concurrent):在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行。 同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行。 并行(Parallel):当系统有一个以上CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU资源,可以同时进行,这种方式我们称之为

世上哪有什么岁月静好,不过是有人替你负重前行 2万+

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

多线程详解

​​学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:想系统/深入学习某技术知识点…一个人摸索学习很难坚持,想组团高效学习…想写博客但无从下手,急需写作干货注入能量…热爱写作,愿意让自己成为更好的人…...

m0_65144570的博客 2063

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Qt多线程

Qt 提供了多种方式来处理多线程编程,它不仅使多线程操作更易于管理,还与 Qt 的事件驱动架构紧密集成。下面是 Qt 多线程编程的详细介绍,包括关键类、模式以及常见的使用场景。

強雲的博客 2325

什么是多线程

什么是多线程? 多线程是一种同时执行多个线程的技术,它不允许进程或操作系统生成计算机中运行的程序的多个副本,而是在不创建程序多个副本的情况下,同时管理多个用户或同一用户的多个请求。 线程是轻量级进程,是处理的最小单元,同时运行多个线程称为多线程。因此,基本上,这是一种由多个处理器使用单个代码集的方法。 了解多线程 1.为了理解多线程,需要理解两个术语。 (1)线程:线程是进程的独立或基本单元。 (2)进程:正在执行的程序称为进程,一个进程中存在多个线程。 2.多线程中的执行是并发的和并行的。 (1)并发执行

qf2019的博客 1万+

一文讲清多线程和多线程同步

一个进程内多个线程并发执行的情况就叫多线程,每个线程是一个独立的执行流,多线程是一种编程模型,它与处理器无关、跟设计有关。并行计算:充分利用多核,提升整体吞吐,加快执行速度。后台任务处理:将后台线程和主线程分离,在特定场景它是不可或缺的,如:响应式用户界面、实时系统等。我们用2个例子作说明。同一进程内的多个线程会共享数据,对共享数据的并发访问会出现(竞争状况)。协调多个线程对共享数据的访问,避免出现数据不一致的情况。

excellent_fish_c的博客 1887

C++多线程-多线程调试

软件调试是我们软件开发过程中的重要一课。在前面,我们也讨论过程序调试,比如说这里。今天,我们还可以就软件调试多讲一些内容。比如说条件断点,数据断点,多线程断点等等。 #include <stdio.h> int value = 0; void test() { int total; int index; total = 0; ...

逍遥云恋 2359

php 怎么实现多线程,php 实现多线程

通过php的Socket方式实现php程序的多线程。php本身是不支持多线程的,那么如何在php中实现多线程呢?可以想一下,WEB服务器本身都是支持多线程的。每一个访问者,当访问WEB页面的时候,都将调用新的线程,通过这一点我们可以利用WEB服务器自身的线程来解决PHP不支持多线程的问题。下面给出通过 fsockopen() 建立socket连接,然后用 用fputs() 发送消息,来实现的PHP...

weixin_28756427的博客 1万+

【Java多线程】Java多线程技能

到 1. 进程和多线程的概念及线程的优点 提到多线程这个技术就不得不提及“进程”这个概念,在“百度百科”中对进程的解释如下: 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。 进程是受操作系统管理的基本运行单元。 那什么是线程呢? 线程可以理解成是在

一定要站在自己热爱的生活里闪闪发光 4万+

C++多线程

多线程(Multithreading)是指从软件或者硬件上实现多个线程并发执行的技术。在一个程序中,这些独立运行的程序片段叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包括对称多处理机、多核心处理器以及芯片级多处理或同时多线程处理器。

yegu001的博客 1379

Python 多线程

多线程是指程序中可以独立于其他部分并发执行的一系列指令。可以将它们视为进程中的不同单元,这些单元在被调度时可以独立完成任务。当线程需要等待缓慢的外部操作(如网络请求或磁盘访问)完成时,它们会暂时休眠,从而使调度器可以将时间分配给其他线程执行。进程是计算机程序的一个可执行实例。通常,一个进程是在单个控制流序列中执行的。进程是操作系统分配资源的基本单位,每个进程包含一个或多个线程。进程之间是隔离的,每个进程拥有自己的内存空间和系统资源。在这篇文章中,我们探讨了 Python 多线程的基本概念。

疯一样的码农 1428
上一篇: android学习笔记一(基础部分)
下一篇: 正则笔记
webrobot
博客等级 码龄23年 111粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值