多线程系列之创建线程

sentaurus浪涌仿真sdevice代码解释(4) 9. `Plot(FilePrefix="Surge_n@node@" time=(Range=(0 @<0+10E-3>@) Intervals=10) NoOverWrite)`:设置了一个绘图过程,用于在瞬态分析过程中绘制结果,文件名前缀为`Surge_n@node@`,时间范围从0到`10E-3`秒,每隔10个时间点绘制一次,且不覆盖之前的结果。同样设置了最大迭代次数和线搜索阻尼系数。这个过程将模拟从`0`到`10E-3`秒内器件的行为,并且会在不同的时间点记录和绘制电流和电势的数据。 阅读详情

先来两个例子,回顾启动线程两种方法:

1、实现Runnable接口

Runnable 接口只有一个方法。run()方法。

Thread newThread= new Thread(target);//target是接口类型

Runnable的run方法可以使用Thread的静态方法

 

public class ThreadTest1 {

	//实现Runnable,实现run方法
	    public static void main(String[] args) {		
		Runner1 runner1=new Runner1();
		Thread th=new Thread(runner1);
		th.start();//启动其他线程必须有start()方法
		
		for(int i=0;i<20;i++){
			System.out.println("main方法线程----------:"+i);
		}
	}
	
	static class  Runner1 implements Runnable{
		public void run(){

			for(int i=0;i<20;i++){
				System.out.println("Runner:"+i);
			}			
		}		
	}
}

2、子类继承Thread,重写run方法;再实例化子类

class MyThread extends Thread{

public void run(){。。。}

} 

MyThread myThread=new MyThread();

public class ThreadTest1 {
	//继承Thread 重写run方法
	public static void main(String[] args) {		
		Runner1 runner1=new Runner1();
		runner1.start();
		
		for(int i=0;i<20;i++){
			System.out.println("main方法线程----------:"+i);
		}
	}
	
	static class  Runner1 extends Thread{
		public void run(){

			for(int i=0;i<20;i++){
				System.out.println("Runner:"+i);
			}			
		}		
	}
}

线程概念

单线程的程序只有一个顺序执行流;

多线程的程序可以包含多个顺序执行流,多个顺序流之间互不干扰;

一句话:线程是程序里不同的执行路径;

进程是分配资源单位,静态的;线程是调度、执行单位,动态的;

线程的优势

线程是共享的环境:进程代码段、进程的公有数据等。

线程可以共享内存,进程不能;

多线程实现多任务比多进程的效率高;

java语言内置了多线程功能支持,而不是单纯的作为底层操作系统的调度方式,从而简化java的多线程编程。


线程创建和启动

Thread类代表线程,所有线程对象都是这个类或子类的实例。

run()代表线程要完成的任务,即线程执行体

start()启动多线程

main()主方法,代表主线程的线程执行体,默认的

Thread.currentThread():静态方法,返回当前正在执行的线程

getName():获取线程名,例如Thread-0、Thread-1等

创建:集成Thread类,实现Runnable、Callable接口,可以实现多线程

生命周期

就绪态、运行态、等待态


状态转换

线程死亡:线程正常结束、抛出异常或错误;

stop()方法来结束线程,容易导致死锁,通常不推荐使用,

isAlive()检查线程生命


控制线程

join()让一个线程等待另一个线程,把分支线程再合并回来。

/**
 * join合并线程
 * @author bobo
 * 未合并前,main方法先执行完,再执行t2
 *把t2合并回来,直到t2执行完了,再执行main方法
 */
public class TestJoin {

	public static void main(String[] args) {
		
		MyThread2 t2 = new MyThread2("t2");
		t2.start();
		
		try {
			t2.join();
		} catch (InterruptedException e) {
			
		}
		for(int i=0;i<=10;i++){
			System.out.println("i am mian Thread");
		}
	}
	
	public static class MyThread2 extends Thread{
		MyThread2 (String s){
			super(s);
		}
		public void run(){
			for(int i=0;i<=10;i++){
				System.out.println("i am " +getName());
				try {
					sleep(1000);
				} catch (InterruptedException e) {
					return;
				}
			}			
		}
	}

}

Sleep()线程睡眠

public synchronized void method() throws Exception {
		Thread.sleep(2500);//睡眠2.5秒,这期间其他线程不能占用
		b = 2000;
	}
	

yield()线程让步

/**
 * 让出cpu一会,让给其他线程执行一会儿
 * @author bobo
 *
 */
public class testYield {

	public static void main(String[] args) {
		MyThread3 t1 = new MyThread3("t1");
		MyThread3 t2 = new MyThread3("t2");
		
		t1.start();
		t2.start();
	}
	
	static class MyThread3 extends Thread{
		MyThread3(String s){
			super(s);
		}
		public void run(){
			for(int i=0;i<=100;i++){
				System.out.println(getName()+":"+ i);
				System.out.println(Thread.currentThread().isAlive());
				if(i % 10==0){
					yield();//让出cpu
				}
			}
		}
	}
}

线程同步和死锁

Synchronized关键字,保证共享数据的完整性。保证在任一时刻只能有一个线程访问。

1、public snchronizedvoid add(){}//当前方法锁定

2、synchronized(this){//锁机制,锁定当前,保证了原子性,不会有第二个线程进来打断}

/**
 * 同步,两个线程,一个的执行要拿到另一个线程给的资源,否则就是阻塞状态
 * @author bobo
 *
 */
public class TestSynchronized implements Runnable {
	Timer t=new Timer();
	public static void main(String[] args) {
		TestSynchronized test=new TestSynchronized();
		Thread t1=new Thread(test);
		Thread t2=new Thread(test);
		t1.setName("T1");
		t2.setName("T2");
		
		t1.start();
		t2.start();
	}
	
	static class Timer{
		private static int num=0;
		public synchronized void add(String name){
			num++;
			try{
				Thread.sleep(100);
			}catch(InterruptedException e){
				
			}
			System.out.println(name+",你是第【"+num+"】个使用timer的线程!");
		}
	}

	@Override
	public void run() {
		t.add(Thread.currentThread().getName());		
	}
}

死锁

我的理解是:当多个线程有共享资源,但是互相等待对象释放资源。

    下面例子产生了死锁,两个线程都抓着资源不放,等待对方释放资源,但最终谁也等不到,而产生了死锁。

public class TestDeadLock implements Runnable {

	public int flag=1;
	static Object o1=new Object(),o2=new Object();
	
	@Override
	public void run() {
		System.out.println("flag="+flag);
		if(flag==1){
			synchronized(o1){
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					
					e.printStackTrace();
				}
				synchronized(o2){
					System.out.println("11");
				}
			}
		}
		if(flag==0){
			synchronized(o2){
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					
					e.printStackTrace();
				}
				synchronized(o1){
					System.out.println("00");
				}
			}
		}
	}

	public static void main(String[] args) {
		TestDeadLock dl=new TestDeadLock();
		TestDeadLock dl2=new TestDeadLock();
		
		dl.flag=1;
		dl2.flag=0;
		
		Thread t1=new Thread(dl);
		Thread t2=new Thread(dl2);
		
		t1.start();
		t2.start();

	}

}

以上是线程的基本知识,后面还会有很多地方会用到多线程,再一一介绍,既然有同步,就会有一个种生产者消费者的情况产生,后一个介绍,生产者和消费者的例子。



使用Python下载ECMWF的ERA-5数据 一、注册账号 [官网]https://www.ecmwf.int/ 二、登录后获取下载key https://cds.climate.copernicus.eu/api-how-to 如图右侧红色框中的内容复制保存为TXT文件,并重命名为“.cdsapirc”,注意前面有点,保存在 C:\Users\username\.cdsapirc,(WINDOWS系统),username指当前电脑登录账户。 三、安装cdsapi库 以pycharm为例: 在pycharm中依次打开:File>setting 阅读详情

相关推荐

BK7238(XH-WB3S)固件烧录实战:从AT固件选择到稳定下载全解析

本文详细解析了BK7238(XH-WB3S)模组固件烧录的全过程,从AT固件版本选择到稳定下载的实战技巧。重点介绍了烧录前的准备工作、硬件连接的正确姿势、烧录软件的实战技巧以及疑难问题排查指南,帮助开发者高效完成BK7238模组的固件烧录。

weixin_29159441的博客 251

C# 异步多线程实现(二)Thread类

C# 异步多线程实现(二)Thread类

xiaoyaolangwj的博客 1224

银河麒麟V10ServerSP3中安装Nacos2.4.x详细教程

银河麒麟V10ServerSP3中安装Nacos2.4.x详细教程

yuanjinshenglife的专栏 1302

Java复习笔记(四)多线程的简单实例

1.创建线程 `Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("Runnable接口方式实现多线程"); } }); 2.线程睡眠 public class SleepTest { public static...

qq_45118892的博客 265

腾讯WeKnora开源了!手把手教你用Docker+Ollama本地部署多模态知识库(附避坑指南)

本文详细介绍了腾讯开源的多模态知识库工具WeKnora的本地部署方法,通过Docker和Ollama实现完全离线运行。文章包含环境准备、核心组件配置、Ollama模型集成、系统启动验证及高级性能调优等实战内容,特别适合需要构建私有化知识库的中小团队和个人开发者。

weixin_30664051的博客 479

【Simscape】用Simscape实现三维物理仿真(三)——创建一个滑块单摆系统

1 首先创建一个Simscape Multibody 模型 (方法见 【Simscape】用Simscape实现三维物理仿真(一)——创建一个自由落体小球) 2 创建四个Solid模块 (1)摆杆 Shape : Brick Dimensions : [0.1 0.05 1] m (2)摆杆轴 Shape : Cylinder Radius : 0.02 m Le...

ReadAir的专栏 9036

C#线程(Thread)与线程顺序的列子

C#线程(Thread)与线程顺序的列子

过客 1505

ANSYS HFSS 中的相控天线阵列仿真方法

相控天线阵列系统广泛使用,从国防雷达应用到商业 5G 应用。设计这些天线阵列涉及复杂的数学运算,需要全波仿真。Ansys HFSS 全场 3D 电磁仿真软件可以在合理的时间内以较低的计算成本仿真复杂的相控阵天线系统,同时考虑复杂激励、环境(即附近的天线)和平台对其性能的影响。本博客介绍了可用于有效仿真相控天线阵列的不同方法。以下是不同仿真方法的简要概述,视频链接中提供了完整的演示。ANSYS HFSS 提供 4 种不同的相控天线阵列仿真方法:1) 晶胞-无限阵列。

jkh920184196的博客 4254

Thread线程

龟兔赛跑: package thread; public class Tortoise implements Runnable{ private int totalStep; private int step; public Tortoise(int totalStep) { this.totalStep=totalStep; } @...

爱写Bug 271

OpenClaw 与十几款国产 “龙虾” 智能体深度对比

详解介绍OpenClaw和各种类似国产“龙虾”智能体工具深度对比

program哲学 2349

Linux ARM平台开发系列讲解(调试篇) 1.6.4 NVIDIA AGX Xavier以太网MAC TO MAC模式

内核发展了那么多年,早已经将这种场景集成到了内核里,具体添加方式如下,本次针对。具体详细描述,可参考本专栏的网络篇和交换机篇,这里就简单的提一句,想要使用。速率和双工状态固定死,使其和交换机的模式一模一样,双方就可以建立通信了。2. MAC TO MAC原理。3. 开启无PHY模式进入内核。模式,本章节记录调试过程。模式,简单来说就是字面意思,以太网部分需要与交换机。,其他芯片也是一样的。修改设备树文件,将与。

DSMGUOGUO的博客 1530

线程

线程:是一个程序里面不同的执行路径。run();方法的调用和start();线程的启动package com.bjsxt.thread;public class ThreadTest { public static void main(String[] args) {  Runner r = new Runner();  r.run();//方法调用,首先执行方法内的,然后再执行主函数//  Thread t = new Thread(r);//  t.start();//启动线程,通知cpu启动了一个线程

fengjia0769的专栏 350

电路板保险丝如何选型

在电路板保险丝选型过程中,需要考虑多个因素以确保其适合特定的电路需求。最后,经过以上程序选定的样品需要在实际的电路中进行测试,以验证所选择的保险丝是否合适。

weixin_57010826的博客 1310

【多线程系列】线程的创建

进程和线程的区别,能否举例说明? 线程的创建方式有几种? Java中 Thread类及其常见方法你了解哪些? run()和start()的区别? join()和sleep()的区别? 你能说一下线程的状态都有哪些?分别表示什么意义 多线程可能会带来哪些风险? ...

可能是一只知更鸟 737

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Java多线程开发系列之二:如何创建多线程

在run方法中,如果需要使用当前线程对象的方法(如getName,setName)或字段,方法一可以直接使用(因为它本身就是正在执行的线程对象),而方法二则需要使用Thread.CurrentThread()方法来获取当前执行的线程对象(因为正在运行这个方法,所以当前线程对象即为运行这个方法的线程对象(有点拗口),有点绕的味道),然后调用当前线程对象的方法。1、定义一个类,这个类需要实现Runnable接口,仍然需要在该类中重写接口中的run方法,与方法1一样,这个run方法也是未来的线程执行体。

cxytony的博客 742

VC中sqlite的使用

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

多线程系列三之创建多线程

本质上2方法相同,只不过把实现Runnable任务交给了匿名内部类的语法,new Runnable 描述了一个任务的内容 实例对象,然后把他交给了Thread的构造方法。本质上和1方法相同 new Thread 子类 只是这个子类没有名字 所以叫做匿名内部类 然后通过父类的引用指向了子类的run方法。

m0_73456308的博客 107

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【JavaEE初阶系列】——多线程 之 创建线程

(因为上面start调用了系统的api,让系统再调用run()方法,所以我们就实现了后面的代码)但是这个run()不能创建新的线程,只能去创建一个主线程,再自己创建的类里面的run()方法。,不过关于谁先打印,大概率是main方法下的,因为调用start之后,新的线程被创建也是有一定的开销的,创建过程中,主线程就执行了自己main方法下的线程。我们之前接触到的程序都是单线程的,不是多线程的,就是程序运行的时候,进行的是多个方向(线程)打印。是静态方法,是依赖于类的,而不是依赖于对象的。

m0_74438843的博客 1131

多线程系列-从学会创建多线程开始

多线程 4 多线程常见场景 客户端(移动端App端)开发 异步发送短信/邮件 执行比较耗时的代码改用多线程异步执行,提高接口的响应速度 异步写入日志(日志框架底层) 多线程下载 5 多线程的创建方式 5.1 继承Thread类 /** * @ClassName ThreadDemo * @Description 继承Thread * @Author Fclever * @Date 2021/12/16 11:12 **/ public class ThreadDemo extends Thre

qq_41649001的博客 750

【多线程系列】线程的创建与启动详解

一、创建线程 下面两种方式相信一定非常的熟悉,这是我们常用的方式,下面就以它开头,对线程的创建和启动做一个详细的分析。也是希望通过分析这个过程来理解多线程。 1、继承Thread的方式创建线程 public class ThreadTest extends Thread { public void run(){ System.out.println("重写run方法"); } public static void main(String[] args) {

王华春_Jason 1248

多线程系列之二——创建线程

概述 原本单进程运行的程序,在创建了线程之后就会由单进程变为多线程。原来的进程叫做主线程,创建出来的线程叫做子线程。 创建线程 创建线程的函数: int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg); 第一个参数为线程的id号。第二个为线程的传入的属性,可以传入null,使用默认的属性即可。第三个为回调函数。第四个是传入回调函数的参数。 ..

mengxiao12345678的博客 104

[C++ 2011 多线程系列一]如何创建线程

/* thread.cpp 演示了创建线程的多种方法 */ #include #include #include #include #include #include #include #include using namespace std; template T stringcat(T &x,T &y) {  std::cout  x += x;

hzhxxx的专栏 3452

Java多线程系列-线程创建

1.怎样创建多线程? Java从语言级别实现多线程,因此实现一个多线程程序很easy。有两种方法能够实现多线程,即继承Thread类和实现Runnable接口。由于Java不支持多继承的原因,建议尽可能通过实现Runnable接口实现多线程。使用Runnable接口实现多线程有例如以下长处: 1、能够避免由于Java的单继承特性而带来的局限。 2、增强程序的健壮...

aoe41606的博客 58

死磕Java系列之多线程创建和线程状态

当我们提到单线程的时候,会思考几个问题: (1)线程是什么?人们通常将线程和进程进行比较,那么,线程和进程有哪些相似和不同呢? (2)如何创建一个线程呢?创建线程有哪些方法呢? (3)当我们定义好一个线程以后,那么,线程有哪些状态呢? 这篇文章将会从这三个方面介绍线程的基础知识。 (一)线程是什么?         在计算机程序中,一个程序能够执行多个任务,通常将每一个任务称之为线程,可以运行...

尚拙的博客 340

多线程系列之创建和启动

多线程系列之创建和启动 一 线程相关概念 进程 进程是计算机程序的一次运行活动,是操作系统进行资源分配和调度的基本单位。 线程 线程是进程的一个执行单元,一个线程就是进程中一个单一顺序的控制流, 进程的一个执行分支;进程是线程的容器,一个进程至少有一个线程.一个进程中也可以有多个线程;在操作系统中是以进程为单位分配资源,如虚拟存储空间,文件描述符等. 每个线程都有各自的线程栈,寄存器环境和线程本地存储。 主线程和子线程 JVM 启动时会创建一个主线程,该主线程负责执行 main 方法,主线程就是运行mai

hcyxsh的博客 243

QtConcurrent系列之run函数创建多线程

在Qt多线程编程中,我们一般使用QThread,QRunnable等类来实现多线程。除此之外,QT还提供了一个更高级的实现多线程的方式,那就是QtConcurrent框架,QtConcurrent框架中提供了许多高级的,性能更好的多线程API函数,这些函数非常方便使用。本文重点介绍QtConcurrent:run函数,使用该函数可以方便的创建一个多线程。 使用QTConcurrent之前,需要...

Damocles_shi的博客 1789

多线程系列:Java创建线程的方式

每一个java攻城狮都应该知道的,Java常见线程创建方式,线程池常见参数原理,以及线程常见问题。

cc_百川 357
上一篇: 疯狂Java系列之List集合
下一篇: 多线程系列之生产者和消费者
mayfla
博客等级 码龄14年 312粉丝 191原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值