自学内容网 自学内容网

java并发编程

力扣

2390. 从字符串中移除星号

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

在一步操作中,你可以:

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

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

注意:

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

线程与进程

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

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

img

进程

什么是进程?

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

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

image-20240914222537989

进程的几个概念

结构特性

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

动态性

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

异步性

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

并发性

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

独立性

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

线程

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

img

线程的定义

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

线程和进程的区别

img

线程的切换方式

img

线程生命周期

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

线程创建

继承Thread类
public class ThreadDemo01 extends Thread {
@Override
public void run() {
for(int i =0;i<10;i++) {
System.out\.print(this.getName()+":"+i);
  }
 }
}

public static void main(String[] args) {
new ThreadDemo01().start();
}

程序运行结果:

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接口
public class ThreadDemo01 implements Runnable {
@Override
    public 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();
}
}                             
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接口
public class ThreadDemo01 implements Callable<Integer> {

@Override
public 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());
}
}

程序运行结果:

s:499500

线程就绪

img

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

线程运行

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

img

线程阻塞

img

(1) sleep(n)

(2) join()

(3) yield()

(4) wait()

线程死亡

img

守护线程和用户线程

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

用户线程

创建的线程

守护线程

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();


 


原文地址:https://blog.csdn.net/2402_85051002/article/details/142431182

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!