java并发编程
力扣
2390. 从字符串中移除星号
给你一个包含若干星号 *
的字符串 s
。
在一步操作中,你可以:
- 选中
s
中的一个星号。 - 移除星号 左侧 最近的那个 非星号 字符,并移除该星号自身。
返回移除 所有 星号之后的字符串**。**
注意:
- 生成的输入保证总是可以执行题面中描述的操作。
- 可以证明结果字符串是唯一的
线程与进程
业务场景:小明去理发店理发。
小明去理发店理发,完成理发需要吹,剪,洗、理的过程。由这个场景我们引用进程和线程这两个概念。
进程
什么是进程?
进程是具有独立功能的程序关于某个数据集合上的一次运行活动,是系统进行资源分配和调度的独立单位。进程是可与其他程序并发执行的程序,在一个数据集合上的运行过程。它是系统进行资源分配和调度的一个独立单位。
大家打开windows的任务管理器就可以看到,系统运行的进程。
进程的几个概念
结构特性
为了控制和管理进程,系统为每个进程设立一个**进程控制块\- PCB。
动态性
进程的实质是程序的一次执行过程,进程是动态产生,动态消亡的,进程在其生命周期内,在三种基本状态(产生、执行、消亡)之间转换。
异步性
由于进程间的相互制约,使进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。
并发性
任何进程都可以同其他进程一起向前推进。
独立性
进程是一个能独立运行的基本单位,同时也是系统分配资源和调度的独立单位。
线程
我们把理发这个进程分解为几个子任务(线程)如下:
线程的定义
- 线程是程序执行的**最小单位\,而进程是操作系统分配资源的最小单位;
- 一个进程由一个或多个线程组成,线程是一个进程中代码的**不同执行路线\;
- 进程之间相互独立,但同一进程下的**各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源(如打开文件和信号等),某进程内的线程在其他进程不可见;
- 调度和切换:线程上下文切换比进程**上下文切换要快得多\;
线程和进程的区别
线程的切换方式
线程生命周期
线程创建
继承Thread类
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();
}
程序运行结果:
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 { @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();}
}
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> {@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());}
}
程序运行结果:
s:499500
线程就绪
Thread t = new Thread( );
t.start( ); //启动线程(线程就绪)
线程运行
一旦CPU分配了运行时间,就调用线程的run( )方法。
线程阻塞
(1) sleep(n)
(2) join()
(3) yield()
(4) wait()
线程死亡
守护线程和用户线程
守护最后一个用户线程才结束。
用户线程
创建的线程
守护线程
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();