java并发编程

devtools/2024/9/24 3:42:36/

力扣

2390. 从字符串中移除星号

给你一个包含若干星号 * 的字符串 s

在一步操作中,你可以:

  • 选中 s 中的一个星号。
  • 移除星号 左侧 最近的那个 非星号 字符,并移除该星号自身。

返回移除 所有 星号之后的字符串**。**

注意:

  • 生成的输入保证总是可以执行题面中描述的操作。
  • 可以证明结果字符串是唯一的

线程与进程

业务场景:小明去理发店理发。

小明去理发店理发,完成理发需要吹,剪,洗、理的过程。由这个场景我们引用进程和线程这两个概念。

img

进程

什么是进程?

进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位。进程是可与其他程序并发执行的程序,在一个数据集合上的运行过程。它是系统进行资源分配和调度的一个独立单位。

大家打开windows的任务管理器就可以看到,系统运行的进程。

image-20240914222537989

进程的几个概念

结构特性

为了控制和管理进程,系统为每个进程设立一个**进程控制块\- PCB。

动态性

进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的,进程在其生命周期内,在三种基本状态(产生、执行、消亡)之间转换。

异步性

由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。

并发性

任何进程都可以同其他进程一起向前推进。

独立性

进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位。

线程

我们把理发这个进程分解为几个子任务(线程)如下:

img

线程的定义

  1. 线程是程序执行的**最小单位\,而进程是操作系统分配资源的最小单位;
  2. 一个进程由一个或多个线程组成,线程是一个进程中代码的**不同执行路线\;
  3. 进程之间相互独立,但同一进程下的**各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源(如打开文件和信号等),某进程内的线程在其他进程不可见;
  4. 调度和切换:线程上下文切换比进程**上下文切换要快得多\;

线程和进程的区别

img

线程的切换方式

img

线程生命周期

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

线程创建

继承Thread类
java">public class ThreadDemo01 extends Thread {	@Overridepublic void run() {for(int i =0;i<10;i++) {System.out\.print(this.getName()+":"+i);}}
}public static void main(String[] args) {new ThreadDemo01().start();
}

程序运行结果:

java">Thread-0:0
Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4
Thread-0:5
Thread-0:6
Thread-0:7
Thread-0:8
Thread-0:9
实现Runnable接口
java">public class ThreadDemo01 implements Runnable {	@Overridepublic void run() {for(int i =0;i<10;i++) {System.*out\*.println(Thread.*currentThread*().getName()+":"+i);}}public static void main(String[] args) {new Thread(new ThreadDemo01()).start();}
}                             
java">Thread-0:0
Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4
Thread-0:5
Thread-0:6
Thread-0:7
Thread-0:8
Thread-0:9
实现Callable接口
java">public class ThreadDemo01 implements Callable<Integer> {@Overridepublic Integer call() throws Exception {int sum = 0;for (int i = 1; i < 1000; i++) {sum += i;}return sum;
}
public static void main(String[] args) throws Exception {FutureTask<Integer> ft =new FutureTask<Integer>(new ThreadDemo01());ft.run();System.*out\*.println("s:" + ft.get());}
}

程序运行结果:

java">s:499500

线程就绪

img

java">Thread  t = new Thread( );
t.start( ); //启动线程(线程就绪)

线程运行

一旦CPU分配了运行时间,就调用线程的run( )方法。

img

线程阻塞

img

(1) sleep(n)

(2) join()

(3) yield()

(4) wait()

线程死亡

img

守护线程和用户线程

守护最后一个用户线程才结束。

用户线程

创建的线程

守护线程

java">public static void main(String[] args) {
Thread t1 = new Thread(() -> {while (true) {try {Date d = new Date();SimpleDateFormat sdf = new SimpleDateFormat("yy-MM-dd hh:mm:ss");System.out.println(sdf.format(d));Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}
});Thread t2 = new Thread(()->{for(int i=0;i<100;i++){try {System.out.println("我是许则"+i);Thread.sleep(100);} catch (InterruptedException e) {throw new RuntimeException(e);}}
});t1.setDaemon(true);
t1.start();
t2.start();

i++){
try {
System.out.println(“我是许则”+i);
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
});

t1.setDaemon(true);
t1.start();
t2.start();


http://www.ppmy.cn/devtools/116305.html

相关文章

Qt系统相关——QThread

文章目录 QThread的API使用示例客户端多线程应用场景互斥锁QMutexQMutexLockerQReadWriteLocker、QReadLocker、QWriteLocker 条件变量和信号量 QThread的API Qt中的多线程和Linux中的线程&#xff0c;本质上是一个东西 Linux线程概念 Linux多线程——线程控制 Linux多线程——…

《CUDA编程》1.GPU硬件与CUDA环境搭建

1 GPU 介绍 GPU&#xff08;graphics processing unit&#xff09;&#xff0c;意为图形处理器&#xff0c;也被称为显卡&#xff08;graphics card&#xff09;。GPU的浮点数运算峰值就比同时期的CPU高一个量级&#xff1b;GPU的内存带宽峰值也比同时期的CPU高一个量级。 CP…

weblogic CVE-2018-2894 靶场攻略

漏洞描述 Weblogic Web Service Test Page中⼀处任意⽂件上传漏洞&#xff0c;Web Service Test Page 在 "⽣产模式"下默认不开启&#xff0c;所以该漏洞有⼀定限制。 漏洞版本 weblogic 10.3.6.0 weblogic 12.1.3.0 weblogic 12.2.1.2 28 weblogic 12.2.1.3 …

Spring(四)多线程+异步任务执行服务+常见的Enable注解+SpringUnit测试

Spring多线程 Spring通过任务执行器&#xff08;TaskExecutor&#xff09;来实现多线程和并发编程ThreadPoolTaskExecutor实现一个基于线程池的TaskExecutor配置类中EnableAsync开启对异步任务的支持使用Async声明该任务为异步 ①、配置类 Configuration ComponentScan(&quo…

CVC输入语言

声明 位向量表达式&#xff08;或项&#xff09;由位向量常数、位向量变量以及下列函数构成。在STP中&#xff0c;所有变量必须在使用前声明。声明一个长度为32的位向量变量的例子是&#xff1a;x : BITVECTOR(32);。声明数组的例子如下&#xff1a; x_arr : ARRAY BITVECTOR(…

文本分类实战项目:如何使用NLP构建情感分析模型

文本分类实战项目&#xff1a;如何使用NLP构建情感分析模型 一、引言 随着互联网的迅速发展&#xff0c;用户在社交媒体、产品评论、论坛等平台上产生了大量的文本数据。通过分析这些数据&#xff0c;我们可以了解用户的情绪和态度&#xff0c;而情感分析就是专门用于分析文本…

伦敦金的交易差价意味着什么?

在伦敦金投资市场上&#xff0c;点差是指交易平台的买入价&#xff08;买价&#xff09;和卖出价&#xff08;卖价&#xff09;之间的差额。对投资者来说&#xff0c;点差是交易成本的一部分&#xff0c;但它是经纪商的收入来源。点差代表伦敦金投资者在进入和退出交易时需要支…

C#基础(13)结构体

前言 随着函数的讲解完成&#xff0c;我想你已经初步有了写一些复杂逻辑功能的能力&#xff0c;但是我们会发现其实在我们大部分实际开发情况中&#xff0c;很多我们需要写的变量可能不只有一个属性。 他可能有很多变量&#xff0c;那这时候我们如果要把这些变量集中到一个东…