目录
程序,进程,线程
程序
含义
我的理解:
举例
进程
含义
我的理解:
举例
线程
含义
我的理解:
举例
多线程的并发
并发的含义
并发和并行的区别
并发含义
区别
线程的创建
继承 Thread 类创建多线程
案例
代码如下
结果展示
实现Runnable 接口创建多线程
案例
代码如下
结果展示
使用 Lambda 表达式 创建多线程
格式
使用原因(如上图所示)
使用Lambda表达式 重写 龟兔赛跑
代码如下
实现Callable 接口创建多线程
案例
代码展示
结果展示
程序,进程,线程
程序
含义
程序是为了实现特定目标或解决特定问题,用某种计算机语言(如C、C++、Java、Python等)编写的一组指令或语句的集合。这些指令被计算机硬件或软件解释和执行,以完成特定的计算或控制任务。
我的理解:
“程序是程序员使用编程语言编写的代码集合,其中包含算法、逻辑指令和数据处理规则,这些代码通过计算机执行,将抽象的算法和逻辑映射到现实生活中,以实现特定的功能或解决特定的问题,从而满足人们的需要。”
举例
1 我们常常把我们在电脑桌面上的图标称为程序的可视化表示,当我们点击图标时,打开对应的程序
2 在电脑中我们常常把.exe可执行文件作为程序存入硬盘
进程
含义
进程是计算机中程序的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础
我的理解:
进程是 程序开始 到结束这个过程
举例
我们点击电脑桌面上 qq图标,打开qq 和其他人聊天,到我们结束聊天,把qq关了/电脑关机。这一过程 就是进程的体现
线程
含义
线程是“进程”中某个单一顺序的控制流,也被称为轻量进程(lightweight processes)。它是运行中的程序的调度单位,是进程中的一个实体,一个进程可以拥有多个线程,这些线程共享进程的资源。
我的理解:
线程是进程的执行单元,执行着 进程整个过程中线程需要完成的任务
举例
假如有个场景: 你打开qq 和朋友聊天,这时候你想和朋友分享你这边美丽的风景,但你因某些原因,照片迟迟没有发送上去,于是你就跟朋友解释 。
这个过程中 两个线程执行任务有:
线程1 : 聊天 ; 线程2 :发送照片 。通过这副场景,我们知道线程1 和线程2 两者互不制约:并不会因为线程2 (发送照片)暂时无法执行,而不能执行线程1 (聊天)。
从这我们就清楚了,线程和线程之间的关系:并发
多线程的并发
并发的含义
从宏观上理解就是,同时进行着多项任务,但从微观角度上来说:并不是同时的。而是cpu 划分时间区间(时间片)哪个线程先抢到时间片,谁就先执行 ,因此从微观上来说,每过线程都是串行的(排成一条长队,必须先前面的人完成后,下一个才继续。) 。但因为时间片 ,分配时间很短,可以看作同时执行多选任务
下图 就是模拟多线程抢占时间片的场景图
并发和并行的区别
并行含义
并行是一种物理上的概念,它要求程序中的多个任务在真正的同时执行。这通常需要多个处理器或处理器核心的支持。
区别
1 并行更多是依赖机器的配置 ,实现同时执行; 并行更多是依赖时间片轮转调度,从宏观上达到同时执行
线程的创建
继承 Thread 类创建多线程
案例
使用 继承 Thread 类创建多线程 来模拟 龟兔赛跑
兔子速度 8 m/ms; 乌龟 速度 2 m/ms;总长度为100米 ,当兔子跑到80米时休息了4s
代码如下
package itheima.workspace;
public class Demo1 {
public static void main(String[] args) throws InterruptedException {
RunTask rabbit = new RunTask(8,true);
RunTask turtle = new RunTask(2,false);
//启动线程
rabbit.start();
turtle .start();
// 设置线程名称
rabbit.setName("兔子");
turtle.setName("乌龟");
//等待线程结束
rabbit.join();
turtle.join();
long time= rabbit.getSumTime();
long time2= turtle.getSumTime();
if (time>time2) {
System.out.println("乌龟赢得第一名");
}
else {
System.out.println("兔子赢得第一名");
}
}
}
class RunTask extends Thread {
private int speed;
private boolean isSleep;
private long sumTime;
/**
*
* @param speed
* @param isSleep
*/
public RunTask(int speed, boolean isSleep) {
this.speed = speed;
this.isSleep = isSleep;
}
public long getSumTime() {
return sumTime;
}
public void run() {
System.out.println(Thread.currentThread().getName()+"以"+speed+"m/ms速度奔跑");
long startTime = System.currentTimeMillis();
int m=0;
while (true) {
if (isSleep){
if(m==80){
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
m=m+speed;
if(m>=100){
System.out.println(Thread.currentThread().getName()+"走完100米");
break;
}
else {
System.out.println(Thread.currentThread().getName()+"走了"+m+"米");
}
}
sumTime = System.currentTimeMillis()-startTime;
}
}
结果展示
实现Runnable 接口创建多线程
案例
使用实现Runnable 接口创建多线程 来模拟 龟兔赛跑
兔子速度 8 m/ms; 乌龟 速度 2 m/ms;总长度为100米 ,当兔子跑到80米时休息了4s
代码如下
package itheima.workspace;
public class Demo2 {
/**
* @Author: Administrator
* @Description: 使用 实现Runable接口 模拟龟兔赛跑
* @Date: 2024/10/14 下午2:45
* @Version: 1.0
*/
public static void main(String[] args) throws InterruptedException {
RunTask1 rabbit = new RunTask1(8,true);
RunTask1 turtle = new RunTask1(2,false);
Thread thread = new Thread(rabbit,"兔子");
Thread thread1 = new Thread(turtle,"乌龟");
//启动线程
thread.start();
thread1.start();
// 等待线程结束
thread.join();
thread1.join();
long time= rabbit.getSumTime();
long time2= turtle.getSumTime();
if (time>time2) {
System.out.println("乌龟赢得第一名");
}
else {
System.out.println("兔子赢得第一名");
}
}
}
class RunTask1 implements Runnable{
private int speed;
private boolean isSleep;
private long sumTime;
public RunTask1(int speed, boolean isSleep) {
this.speed = speed;
this.isSleep = isSleep;
}
public long getSumTime() {
return sumTime;
}
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"以"+speed+"m/ms速度奔跑");
long startTime = System.currentTimeMillis();
int m=0;
while (true) {
if (isSleep){
if(m==80){
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
m=m+speed;
if(m>=100){
System.out.println(Thread.currentThread().getName()+"走完100米");
break;
}
else {
System.out.println(Thread.currentThread().getName()+"走了"+m+"米");
}
}
sumTime = System.currentTimeMillis()-startTime;
}
}
结果展示
使用 Lambda 表达式 创建多线程
格式
Thread thread = new Thread((Runnable) () -> {
});
使用原因(如上图所示)
Lambda表达式
()->{...}
是一个简化的匿名内部类,它实现了Runnable
接口的run
方法。在上面例子中,Lambda表达式可以替代了创建一个实现了Runnable
接口的类的实例的传统方式。
使用Lambda表达式 重写 龟兔赛跑
代码如下
package itheima.workspace;
public class Demo2 {
/**
* @Author: Administrator
* @Description: 使用 实现Runable接口 模拟龟兔赛跑
* @Date: 2024/10/14 下午2:45
* @Version: 1.0
*/
public static void main(String[] args) throws InterruptedException {
RunTask1 rabbit = new RunTask1(8,true);
RunTask1 turtle = new RunTask1(2,false);
Thread thread = new Thread(() ->{
rabbit.task();
},"兔子");
Thread thread1 = new Thread(()->{
turtle.task();
},"乌龟");
//启动线程
thread.start();
thread1.start();
// 等待线程结束
thread.join();
thread1.join();
long time= rabbit.getSumTime();
long time2= turtle.getSumTime();
if (time>time2) {
System.out.println("乌龟赢得第一名");
}
else {
System.out.println("兔子赢得第一名");
}
}
}
class RunTask1 {
private int speed;
private boolean isSleep;
private long sumTime;
public RunTask1(int speed, boolean isSleep) {
this.speed = speed;
this.isSleep = isSleep;
}
public long getSumTime() {
return sumTime;
}
public void task() {
System.out.println(Thread.currentThread().getName()+"以"+speed+"m/ms速度奔跑");
long startTime = System.currentTimeMillis();
int m=0;
while (true) {
if (isSleep){
if(m==80){
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
m=m+speed;
if(m>=100){
System.out.println(Thread.currentThread().getName()+"走完100米");
break;
}
else {
System.out.println(Thread.currentThread().getName()+"走了"+m+"米");
}
}
sumTime = System.currentTimeMillis()-startTime;
}
}
实现Callable 接口创建多线程
案例
使用 实现Callable 接口创建多线程 来模拟 龟兔赛跑
兔子速度 8 m/ms; 乌龟 速度 2 m/ms;总长度为100米 ,当兔子跑到80米时休息了4s
代码展示
// RunTask类
package itheima.work2;
import java.util.concurrent.Callable;
public class RunTask implements Callable<Long> {
private int step;
private boolean isSleep;
public RunTask(int step, boolean isSleep) {
this.step = step;
this.isSleep = isSleep;
}
public RunTask(int step) {
this.step = step;
}
@Override
public Long call() throws Exception {
long startTime = System.currentTimeMillis();
int m=0;
System.out.println(Thread.currentThread().getName()+"以"+step+"m/ms速度奔跑");
while (true) {
if (isSleep){
if(m==80){
try {
Thread.sleep(4000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
m=m+step;
if (m>=100){
System.out.println(Thread.currentThread().getName()+"走完了100米");
break;
}
System.out.println(Thread.currentThread().getName()+"走了"+m+"米");
}
return System.currentTimeMillis()-startTime;
}
}
// Test测试类
package itheima.work2;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
public class Test {
public static void main(String[] args) throws ExecutionException, InterruptedException {
RunTask runTask = new RunTask(8,true);
RunTask runTask1 = new RunTask(2);
FutureTask<Long> futureTask = new FutureTask<>(runTask);
FutureTask<Long> futureTask1 =new FutureTask<>(runTask1);
//兔子
Thread rabbit=new Thread(futureTask,"兔子");
rabbit.start();
// 乌龟
Thread turtle=new Thread(futureTask1,"乌龟");
turtle.start();
Long l = futureTask.get();
long l1 = futureTask1.get();
if (l<l1){
System.out.println("兔子最先跑到重点");
}
else {
System.out.println("乌龟最先跑到");
}
}
}
结果展示
发现 时间越长,乌龟获胜可能性越大