Java并发(多线程)学习总结

1、程序

在结构上,程序是数据结构加算法再加上相应代码构成的,但是在计算机中程序是以文件形式保存在磁盘等存储器中,说白了就是01串,尚未启动的程序就是个文件,和视频音频文件没有多少区别。

比如电脑中的一个单机游戏(解压直接运行)


?整个文件夹内的内容就是一个程序

?

2、进程

进程是指执行中的程序,计算机中每个进程由操作系统分配相应的系统资源执行,进程是系统资源分配的基本单位

我在写这篇博客的时候是边听音乐边打字,我听音乐用的播放器“多米音乐”此时在运行,这就是一个进程


可以看到同一个程序在运行的时候会产生一个或多个进程,进程间通信是通过共享内存与消息传递两种方式实现,这个在操作系统课程中学习到。

?

3、线程

进程是由一个或多个线程组成的,线程是CPU分配的基本单位,每个线程执行时相互独立

打个比方:多米音乐播放器在运行的时候播放音乐是一个进程,而在播放音乐的同时我想向播放器添加一首我很喜欢的本地的一首歌,此时我就可以执行相应的操作,把本地的那首歌添加到播放器队列中,那么播放音乐的线程与添加音乐到播放器列表就是不同的两个线程,而它们在执行时又不互相干扰,一个进程的子线程是共享该进程的全局变量的,每个线程在创建的时候会在进程的堆栈段中分配资源给各个线程。

?

4、顺序编程与并发编程

下面看一个顺序编程的例子:

public static void main(String[] args) {
	for(int i=0; i<10; i++) {
		print(i);
	}
}
public static void print(int i) {
	System.out.println("第" + (i + 1) + "个数字");
}

?结果:

第1个数字

第2个数字

第3个数字

第4个数字

第5个数字

第6个数字

第7个数字

第8个数字

第9个数字

第10个数字

程序运行分析:程序在运行的时候JVM会启动该程序的一个进程,这个进程就是整个程序的父进程,父进程找到main方法,创建一个线程开始执行main中的代码,当执行到for循环时每次循环父线程会执行相应的方法,然后再再执行后续代码,在这个过程中,如果在执行到第5次循环的时候有一个I/O要求,那么在I/O请求没有完成之前,整个循环就会停在第5次循环那里一直等待,也就是顺序编程会造成“阻塞”

下面看一个并发编程的例子:

public class Threadddd implements Runnable {
	private static int count;
	public static void main(String[] args) {
		for(int i=0; i<10; i++) {
			Runnable t = new Threadddd();
			Thread thread = new Thread(t);
			thread.start();
		}
		System.out.println("父线程结束");
	}
	public void run() {
		System.out.println("第" + (++count) + "个数字");
	}
}

?

?程序输出结果:

第2个数字

第4个数字

第1个数字

第6个数字

第3个数字

第7个数字

第5个数字

父线程结束

第9个数字

第8个数字

第10个数字

再运行一次,程序输出结果:

第2个数字

第5个数字

第4个数字

第6个数字

第7个数字

第3个数字

第1个数字

第8个数字

父线程结束

第9个数字

第10个数字

程序运行分析:每次执行循环时父进程都会创建一个新的子线程并启动子线程,而子线程何时执行跟父线程毫无关系,父线程是指父进程在main开始时创建的线程,从结果可以看到子进程是各自独立完成的,当整个进程中的所有线程全部执行完以后整个进程结束。

?

5、多线程实现:

方式一:实现Runnable接口,重写Runnable接口中唯一的方法run()方法,但是线程在执行时要利用Thread的start来启动,实现方式同上面多线程的例子

方式二:继承Thread类并重写Thread类中的run()方法

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。