论单线程和多线程

在我们日常的项目开发过程中进场会接触到单线程或多线程的知识,那么到底多线程好还是单线程好呢?单线程和多线程的区别又是什么呢?下面我们来看看它们的区别以及优缺点分析及实例展示。

一、线程的含义

线程:每一个任务称为一个线程,线程不能独立的存在,它必须是进程的一部分

单线程:般常见的Java应用程序都是单线程的,比如运行helloworld的程序时,会启动jvm进程,然后运行main方法产生线程,main方法也被称为主线程.

多线程:同时运行一个以上线程的程序称为多线程程序,多线程能满足程序员编写高效率的程序来达到充分利用 CPU 的目的。

二、单线程

每个正在运行的程序(即进程),至少包括一个线程,这个线程叫主线程

主线程在程序启动时被创建,用于执行main函数

只有一个主线程的程序,称作单线程程序

主线程负责执行程序的所有代码(UI展现以及刷新,网络请求,本地存储等等)。这些代码只能顺序执行,无法并发执行。

三、多线程

拥有多个线程的程序,称作多线程程序。

iOS允许用户自己开辟新的线程,相对于主线程来讲,这些线程,称为子线程

可以根据需要开辟若干子线程

子线程和主线程都是独立的运行单元,各自的执行互不影响,因此能够并发执行

四、单线程与多线程的区别

单线程程序:只有一个线程,代码顺序执行,容易出现代码阻塞。

多线程程序:有多个线程,线程间独立运行,能有效地避免代码阻塞,并且提高程序的运行性能。

五、单线程与多线程的优缺点分析

多线程优缺点:
  同步应用程序的开发比较容易,但由于需要在上一个任务完成后才能开始新的任务,所以其效率通常比多线程应用程序低。如果完成同步任务所用的时间比预计时间长,应用程序可能会不响应。多线程处理可以同时运行多个过程。

例如:文字处理器应用程序在您处理文档的同时,可以检查拼写(作为单独的任务)。由于多线程应用程序将程序划分成独立的任务,因此可以在以下方面显著提高性能:

多线程技术使程序的响应速度更快,因为用户界面可以在进行其他工作的同时一直处于活动状态。

当前没有进行处理的任务可以将处理器时间让给其他任务。

占用大量处理时间的任务可以定期将处理器时间让给其他任务。

可以随时停止任务。

可以分别设置各个任务的优先级以优化性能。

是否需要创建多线程应用程序取决于多个因素。在以下情况下,最适合采用多线程处理:

耗时或大量占用处理器的任务阻塞用户界面操作。

各个任务必须等待外部资源(如远程文件或 INTERNET 连接)。

例如:用于跟踪 WEB 页上的链接并下载满足特定条件的文件的 INTERNET 应用程序“ROBOT”。这种应用程序可以依次同步下载各个文件,也可以使用多线程同时下载多个文件。多线程方法比同步方法的效率高很多,因为即使在某些线程中远程 WEB 服务器的响应非常慢,也可以下载文件。

坏处:增加了调度和管理的开销,带来了一些不确定性,需要复杂的同步机制,避免死锁等等。

好处:一定程度上提高响应速度,在多核的情况下还是更能充分利用CPU资源的。

单线程优缺点:
  单线程的也就是程序执行时,所跑的程序路径(处理的东西)是连续顺序下来的,必须前面的处理好,后面的才会执行到。

由于时间片很短,这样给用户的感觉是同时有好多线程在执行。但是线程切换是有代价的,因此如果采用多进程,那么就需要将线程所隶属的该进程所需要的内存进行切换,这时间代价是很多的。而线程切换代价就很少,线程是可以共享内存的。所以采用多线程在切换上花费的比多进程少得多。但是,线程切换还是需要时间消耗的,所以采用一个拥有两个线程的进程执行所需要的时间比一个线程的进程执行两次所需要的时间要多一些。即采用多线程不会提高程序的执行速度,反而会降低速度,但是对于用户来说,可以减少用户的响应时间。上述结果只是针对单CPU,如果对于多CPU或者CPU采用超线程技术的话,采用多线程技术还是会提高程序的执行速度的。因为单线程只会映射到一个CPU上,而多线程会映射到多个CPU上,超线程技术本质是多线程硬件化,所以也会加快程序的执行速度。

线程相对于进程的优点:

1、开销小

2、资源共享性好。

线程相对于进程的缺点:

1、共享资源需要耗费一定的锁资源,同步相对复杂。

2、一个线程崩溃可能导致整个进程崩溃,这个当然是自己的应用程序有问题

六、单线程与多线程实例展示

单线程实例

public class SingleThread {public static void main(String[] args){Thread thread = Thread.currentThread(); //获取当前运行的线程对象thread.setName("单线程"); //线程重命名System.out.println(thread.getName()+"正在运行");for(int i=0;i<10;i++){System.out.println("线程正在休眠:"+i);try {thread.sleep(1000); //线程休眠,延迟一秒} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();System.out.println("线程出错");}}}
}

多线程实例
  
  注意:多线程有两种实现方式,一种是继承Thread类,另一种是实现Runnable接口。
  
  继承Thread类实现多线程

public class TestThread {public static void main(String[] args){Thread n1 = new ExtendThread("n1",3000); //使用上转对象创建线程,并构造线程名字和线程休眠时间Thread n2 = new ExtendThread("n2",6000); Thread n3 = new ExtendThread("n3",9000); n1.start(); //启动线程并调用run方法n2.start();n3.start();}
}
class ExtendThread extends Thread{ //继承Thread的类String name;int time;public ExtendThread(String name, int time) { //构造线程名字和休眠时间this.name=name;this.time=time;}   public void run(){ //重写Thread类的run方法try{sleep(time); //所有线程加入休眠}catch(InterruptedExceptione){e.printStackTrace();System.out.println("线程中断异常");}System.out.println("名称为:"+name+",线程休眠:"+time+"毫秒"); }
}

实现Runnable接口的多线程

public class RunnableThread {public static void main(String[] args){Runnable rb1=new ImplRunnable("rb1",3000); //Runnable接口必须依托Thread类才能创建线程Thread n1=new Thread(rb1); //Runnable并不能调用start()方法,因为不是线程,所以要用Thread类加入线程Runnable rb2=new ImplRunnable("rb2",6000);Thread n2=new Thread(rb2);Runnable rb3=new ImplRunnable("rb3",9000);Thread n3=new Thread(rb3);n1.start(); //启动线程并调用run方法n2.start();n3.start();}
}
class ImplRunnable implements Runnable{ //继承Runnable接口的类String name;int time;   public ImplRunnable(String name, int time) { //构造线程名字和休眠时间this.name = name;this.time = time;}@Overridepublic void run() { //实现Runnable的run方法try{Thread.sleep(time); //所有线程加入休眠}catch(InterruptedException e){e.printStackTrace();System.out.println("线程中断异常");}System.out.println("名称为:"+name+",线程休眠:"+time+"毫秒");}
}

了解更多关注我哟!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle 表空间初始分配,在 Oracle 中创建用户时,若未提及 DEFAULT TABLESPACE 关键字,则 Oracle 就将 ( )表空间分配给用户作为默认表空间。...

【多选题】现代职业高尔夫运动,主要有如下构成要素,即:高水平的职业球员、( )、观众的积极参与、( )和( )。【判断题】凝点较高的含蜡原油,凝点附近粘温曲线很陡,经济进站油温常略高于凝点。( )【单选题】以下哪项不是固有免疫的物理屏障作用【多选题】下列各项中不属于“木”的…

【OpenCV 例程200篇】232. 特征描述之频谱方法

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】232. 纹理特征之频谱方法 4.3 纹理特征之频谱方法 傅里叶谱可以描述图像中的周期性或半周期性二维模式的方向性&#xff0c;因此可以基于傅里叶变换对纹理进行频谱分析。 纹理与图像频谱中的高频分…

并发编程的目的和挑战

并发编程的目的与挑战 并发编程的目的是为了让程序运行得更快。启动更多的线程并不一定就能让程序最大限度地并发执行。 希望通过多线程执行任务让程序运行得更快&#xff0c;会面临非常多的挑战。比如&#xff1a; 上下文切换的问题死锁的问题硬件和软件的资源限制问题上下文…

java制作oracle程序,Java程序操作Oracle两种方式之简单实现

Java程序操作Oracle两种方式之简单实现1.通过JDBC-ODBC桥连接Oracle数据库(1)创建odbc源&#xff0c;在控制面板->管理工具->数据源(odbc)中添加DSN,比如取名为wangtao,选择一个Service,输入用户名密码&#xff0c;测试连接&#xff0c;若通过说明成功&#xff1b;(注意&…

【OpenCV 例程200篇】233. 区域特征之矩不变量

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】233. 区域特征之矩不变量 4.4 区域特征之矩不变量 矩是概率与统计中的一个概念&#xff0c;是随机变量的一种数字特征。矩函数在图像分析中有着广泛的应用&#xff0c;如模式识别、目标分类、图像编…

oracle ip策略,ip rule -- 路由策略数据库管理命令

ip rule -- 路由策略数据库管理命令.8.ip rule -- 路由策略数据库管理命令8.1.缩写rule、ru8.2.对象路由策略数据库的规则用于控制选择路由的算法。Internet上采用的路由算法一般是基于数据包目的地址的。理论上&#xff0c;也可以由TOS域决定&#xff0c;不过这没有实际应用。…

【OpenCV 例程200篇】231. 特征描述之灰度共生矩阵(GLCM)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】231. 特征描述之灰度共生矩阵&#xff08;GLCM&#xff09; 4.2.4 灰度共生矩阵&#xff08;GLCM&#xff09; 灰度共生矩阵&#xff08;Gray level co-occurrence matrix&#xff0c;GLCM&#xff…

oracle11 处理器数,11G AWR中%Total CPU与%Busy CPU指标的疑问

ODM FINDING:FROM http://www.os2ora.com/how-to-analyze-awr-report-1/ 推荐 kaya 的这篇文章引用如下&#xff1a;如果关注数据库的性能&#xff0c;那么当拿到一份AWR报告的时候&#xff0c;最想知道的第一件事情可能就是系统资源的利用情况了&#xff0c;而首当其冲的&am…

【OpenCV 例程200篇】237. 基于主成分提取的方向校正(OpenCV)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】237. 基于主成分提取的方向校正&#xff08;OpenCV&#xff09; 主成分分析&#xff08;Principal Components Analysis&#xff0c;PCA&#xff09;是一种基于统计的数据降维方法&#xff0c;又称主…

Java中12个原子操作类

Java 从 JDK 1.5 开始提供了 java.util.concurrent.atomic 包&#xff08;以下简称Atomic包&#xff09;&#xff0c;这个包中的 原子操作类 提供了一种用法简单、性能高效、线程安全地更新一个变量的方式。 因为变量的类型有很多种&#xff0c;所以在 Atomic 包里一共提供了 …

swoole 捕捉php错误,swoole怎么处理错误

在协程编程中可直接使用try/catch处理异常。但必须在协程内捕获&#xff0c;不得跨协程捕获异常。不仅是应用层throw的Exception&#xff0c;底层的一些错误也是可以被捕获的&#xff0c;如function、class、method不存在下面的代码中&#xff0c;try/catch和throw在不同的协程…

【OpenCV 例程200篇】235. 特征提取之主成分分析(sklearn)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】235. 特征提取之主成分分析&#xff08;sklearn&#xff09; 特征提取是指从原始特征中通过数学变换得到一组新的特征&#xff0c;以降低特征维数&#xff0c;消除相关性&#xff0c;减少无用信息…

Linux 进程资源分配,linux 进程管理和内存分配

1、进程相关概念进程&#xff1a;正在运行中的程序内核功用&#xff1a;进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等Process&#xff1a;运行中的程序的一个副本&#xff0c;是被载入内存的一个指令集合进程 ID(Process ID&#xff0c;PID)号码被用来标记各…

【OpenCV 例程300篇】234. 特征提取之主成分分析(PCA)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程300篇】234. 特征提取之主成分分析&#xff08;PCA&#xff09; 5.1 特征提取的方法 初步获取的图像特征维数通常很大&#xff0c;而且往往包含一定的无关或冗余特征。特征提取是指从原始特征中通过数学变…

Java并发编程基础

线程的简介 什么是线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流&#xff0c;一个进程中可以并发多个线程&#xff0c;每条线程并行执行不同的任务。 为什么要使用多线…

【OpenCV 例程200篇】236. 特征提取之主成分分析(OpenCV)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】236. 特征提取之主成分分析&#xff08;OpenCV&#xff09; 文章目录【youcans 的 OpenCV 例程200篇】236. 特征提取之主成分分析&#xff08;OpenCV&#xff09;5.2 主成分分析的数学方法5.4 OpenC…

linux 访问共享内存,Linux下的共享内存(03)---通过指针访问共享内存中的数据...

环境&#xff1a;Vmware Workstation&#xff1b;CentOS-6.4-x86_64说明&#xff1a;1、将共享内存挂载至进程&#xff1a;void *shmat(int shmid, const void *shmaddr,int shmflg);参数shmid是要附加的共享内存区标示符。总是把参数shmaddr设为0。参数shmflg可以为SHM_RDON…

Java中锁的使用和实现

首先&#xff0c;我们要了解一个概念&#xff0c;JAVA中的锁到底是什么呢&#xff1f; 锁是用来控制多个线程访问共享资源的方式&#xff0c;一般来说&#xff0c;一个锁能够防止多个线程同时访问共享资源。 Lock接口 在Java SE 5之后&#xff0c;并发包中新增了Lock接口&am…

【OpenCV 例程200篇】225. 特征提取之傅里叶描述子

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】225. 特征提取之傅里叶描述子 目标特征的基本概念 通过图像分割获得多个区域&#xff0c;得到区域内的像素集合或区域边界像素集合。我们把感兴趣的人或物称为目标&#xff0c;目标所处的区域就是目…

【OpenCV 例程300篇】238. OpenCV 中的 Harris 角点检测

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】238. OpenCV 中的 Harris 角点检测 角是直线方向的快速变化。角点通常被定义为两条边的交点&#xff0c;或者说角点的邻域应该具有两个不同区域的不同方向的边界。 角是高度有效的特征。角点检测&…