理解单线程和多线程的区别

article/2025/10/2 18:09:10

单线程和多线程

首先我们都知道线程是隶属于进程的,单线程就是程序中只有一个线程,多线程就是程序中有多个线程.通过连个例子理解多线程和单线程.

(一)单线程

创建包:package com.ffyc.javathread;

创建类:public class Sample { }

package com.ffyc.javathread;
public class Sample {//方法1public void method1(){System.out.println("method1");}//方法2public void method2(){method1();System.out.println("method2");}/***主方法(主线程),程序的入口* 这不是多线程案例,是单线程* @param args*/    public static void main(String[] args) {System.out.println("主线程开始");Sample s = new Sample();s.method2();System.out.println("主线程结束");}
}

上面的程序,我们很容易看懂,从main方法进入程序后,打印输出,创建Sample类的对象,然后调用了method2()方法,进入method2()方法后又调用method1()方法,执行完后再一次打印输出,执行过程看下图:

在这里插入图片描述

从上图不难发现,程序是顺着main方法这条主线一气呵成执行完的,所以这是一个单线程。

(二)多线程

package com.ffyc.javathread.demo2;import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;public class MyThread implements Runnable {
/*
* 我们自己写的MyThread类实现Runnable接口,这个不叫线程类
* 只能叫线程要执行的任务
* */@Overridepublic void run() {//输出任务的优先级System.out.println(Thread.currentThread().getName()+": "+Thread.currentThread().getPriority());}}
package com.ffyc.javathread.demo2;public class Test {public static void main(String[] args) {/*MyThread myThread = new MyThread();    myThread. 不出start方法,无法启动线程上面的类中写过了,MyThread类不能叫线程,这个类中的内容只是线程要执行的任务*/MyThread myth = new MyThread();//创建了一线程,并为其分配了一个任务,线程名称为"窗口1"Thread th1 = new Thread(myth,"窗口1");th1.start();//创建了一线程,并为其分配了一个任务,线程名称为"窗口2"Thread th2 = new Thread(myth,"窗口2");th2.start();Thread.currentThread().setPriority(10);  //设置主线程(main()方法)的优先级th1.setPriority(8);  //设置线程(窗口1)的优先级th2.setPriority(6);   //设置线程(窗口2)的优先级//输出主线程的优先级System.out.println("main: "+Thread.currentThread().getPriority());}
}

在测试类()test类中创建一个任务对象即可,每创建一个线程,要执行的任务都传递创建的那一个任务对象。输出结果:

在这里插入图片描述

输出了三个线程的优先级。

上面的程序中,

MyThread myth = new MyThread();//创建了一线程,并为其分配了一个任务,线程名称为"窗口1"Thread th1 = new Thread(myth,"窗口1");th1.start();

这一段就是创建了线程th1,执行任务myth,给线程起名:“窗口1”。 注意,一定要调用start()方法启动线程,不能只创建,不启动。main()方法中创建了两个线程: th1 , th2 ,再加上main()这个主线程,共有三个线程,也就是多线程。

程序的输出结果中并没有按main()方法中的一步一步执行,本来先创建的是th1,但是执行时先执行的是th2线程,这也体现了多线程执行的特点,每个线程的执行顺序和操作系统的调度有关。

有所收获别忘了点赞呦~


http://chatgpt.dhexx.cn/article/NCiVRXRj.shtml

相关文章

ubuntu卸载已安装软件

1.查看已安装软件列表 dpkg -l dpkg -l | grep baidu # 软件包查询筛选# 另外,软件安装也使用dpkg命令 sudo dpkg -i xxxx.deb2.卸载指定软件包 sudo apt-get purge baidunetdisk # 卸载指定软件 sudo apt-get autoremove # 清理不需要的文件 sudo apt-get autoc…

Ubuntu20.04 卸载软件

Ubuntu20.04卸载软件相当的简单, 一 用命令行卸载 sudo apt-get remove --purge 软件名 这样不仅可以卸载掉软件,而且可以清理配置 二 在图形界面卸载软件 首先打开设置 打开应用程序 在其中找到你要卸载的软件 然后点击右上角的 在软件中打开 然后…

Linux bash卸载软件,Ubuntu卸载软件的4种方法

前言 本文重点介绍Ubuntu卸载软件的4种方法。他们分别是图形化界面的synaptic、自动解决依赖关系的apt-get,处理依赖关系更强大的aptitude,还有安装本地deb包的dpkg。 方法一: Ubuntu使用synaptic图形化界面管理软件 oucanrong@zcwyou:~$ sudo apt-get install synaptic -y 以…

Ubuntu卸载软件方式

1、终端输入: dpkg --list 显示出电脑上所有的软件包 左边就是软件名字,中间是版本名 2、在终端上输入命令sudo apt --purge remove 包名 例如我要卸载smartgit 即可

Ubuntu卸载软件

1、利用"软件中心"卸载 在Ubuntu收藏栏中打开软件中心,在已安装的软件中找到要卸载的软件,点击“移除”按钮即可。 提示:需要输入用户密码。 2、在终端中卸载 2.1、找到软件 有些软件在“软件中心”中是找不到的。还是需要用终端…

Ubuntu卸载软件相关命令

查看安装的软件 dpkg -l 查看软件版本 dpkg -l | grep xxx # xxx为软件名称,例如 virtualbox 查看包是否安装 dpkg-query -l *package-name* 例如 virtualbox dpkg -s package-name 例如 virtualbox 列出你系统中安装的所有包,同样可以通过grep…

Ubuntu命令卸载软件

1.打开一个终端,输入dpkg --list ,按下Enter键,终端输出以下内容,显示的是你电脑上安装的所有软件。 2.在终端中找到你需要卸载的软件的名称,列表是按照首字母排序的。 3.在终端上输入命令sudo apt-get --purge remove 包名…

A星算法优化(二)权重系数

本文接上一篇:A星算法优化(一)启发函数 B站详解视频:https://www.bilibili.com/video/BV1EF411W7Rw?spm_id_from333.999.0.0 将从以下5个点进行改进: 1、启发函数——曼哈顿距离等 2、权重系数——动态加权等 3、搜索…

A_star算法

A*算法 A* 搜索算法,即A star search algorithm,简称A* 算法。 是一种在图形平面上对于多个节点的路径求出最低通过成本的算法。是对图的遍历和最佳优先搜索算法,也是对BFS的改进。其思想在于为每个状态建立启发函数,用启发函数制…

A star算法

A star算法介绍 我们在解空间搜索问题的可行解或者最优解时常用宽度优先搜索(BFS)或者深度优先搜索(DFS),但是有时候会扩展出很多无用节点,搜索时间较长,而A*算法则是选择当前估计成本最低的节点进行扩展,图示如下: g(n)为从起始…

【A星算法】A星寻路算法详解(小白也可以看懂+C#代码+零基础学习A*)

1.问题背景 在制作RPG游戏角色和NPC移动时,需要角色自动避开障碍物,到达终点 怎么快速找到一条到达终点的路径? 使用a星寻路算法 2.A星算法的思路 绿色:起点;红色:终点 ;黑色:障碍…

A-star算法自学

搜索过程 广度优先搜索(BFS)算法与Dijsktra算法的结合,可以得出最短的路径。 将地图信息通过划分为方形或者其他多边形格子的方法进行表示,便于利用二维数组存放地图信息,每个格子有可行和不可行两种状态;…

python3.6实现的A星算法

A星算法原理: 原理我就不再赘述,可以参考这篇博客https://blog.csdn.net/hitwhylz/article/details/23089415 最近用js写了一遍,用的同样的算法,需要js代码的看这里:https://blog.csdn.net/qq_39687901/article/details/85697127 代码实现: …

A星寻路算法介绍

你是否在做一款游戏的时候想创造一些怪兽或者游戏主角,让它们移动到特定的位置,避开墙壁和障碍物呢? 如果是的话,请看这篇教程,我们会展示如何使用A星寻路算法来实现它! 在网上已经有很多篇关于A星寻路算…

对A星算法的理解

1、A*算法的**搜索区域 ** 传统A星算法是将地图简化成栅格,计算路径时是用每个栅格的中心点作为单位进行计算。 搜索区域分为两部分:开放列表和封闭列表 开放列表可以进行访问,封闭列表则不可以访问(包括不可走 (unwalkable) 的方…

A星算法(Java实现)

一、适用场景 在一张地图中,绘制从起点移动到终点的最优路径,地图中会有障碍物,必须绕开障碍物。 二、算法思路 1. 回溯法得到路径 (如果有路径)采用“结点与结点的父节点”的关系从最终结点回溯到起点,得到路径。 2. 路径代…

A-Star(A*)算法

【由于专栏后几篇限制vip观看,我又把完整算法在公众号“武汉AI算法研习”进行了发布,可以查看全专栏文章。】 A-Star(A*)算法作为Dijkstra算法的扩展,在寻路和图的遍历过程中具有一定的高效性。 【适用范围】静态图搜索 【算法流程】A-Sta…

A星算法代码

A星算法代码python3实现 前言一、A*? A星1.一个搜索算法2.结果展示 二、使用环境1.python 3.x2.一些解释说明 一些话 前言 产生本文的缘由 学校计科课程要求的小作业, 在csdn上看了好多, 记录一下自己的学习 以下是本篇文章正文内容 一、A*? A星 1.一…

A星算法(基于matlab)

概述 基于上一篇文章提到的DFS算法和BFS算法 A星算法属于图这种数据结构的搜索算法,对比于树的遍历搜索,需要考虑到的问题是:同一个节点的重复访问,所以需要对于已经访问过的节点进行标记。 曼哈顿距离: 在几何度量空…

【A星算法】--第四篇(A星算法)

本篇主要介绍A星算法的过程: * 把起始节点加进openList * while openList 不为空 { * 当前节点 openList 中成本最低的节点 * if(当前节点 目标节点){ * 路径完成 …