精华内容
下载资源
问答
  • 单线程多线程、并行和并发

    千次阅读 2016-02-19 13:29:29
    单线程多线程、并行和并发本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写...

    单线程多线程、并行和并发


    单核与多核

    单核就是CPU集成了一个运算核心,双核就是两个运算核心,相当于两个CPU一起工作。

    x64和x86

    x86是对基于intel处理器的系统的标准缩写,它是对所有*86系统的简单通配符定义,例如8086,80286等等,这些CPU都是指令兼容的,所以都用x86来标识。
    这里,64位是相对于32位而言的,这个位数是指CPU General-Purpose Registers,通用寄存器的数据宽度为64位,64位指令集就是运行64位数据的指令,也可以说处理器一次可以运行64bit数据。
    64bit有两大有点:可以进行更大范围的整数运算,可以支持更大范围的内存。
    除此以外,指针在x86中是四个字节,而在x64中是8个字节,这也是为什么64bit可以支持更大范围的内存;各基本类型如下

        i = sizeof(int);            // x86:4        x64:4  
        i = sizeof(long);           // x86:4        x64:4  
        i = sizeof(void*);          // x86:4        x64:8  
        i = sizeof(short);          // x86:2        x64:2  
        i = sizeof(float);          // x86:4        x64:4  
        i = sizeof(double);         // x86:8        x64:8  
        i = sizeof(int*);           // x86:4        x64:8  
        i = sizeof(WORD);           // x86:2        x64:2  
        i = sizeof(DWORD);          // x86:4        x64:4  
        i = sizeof(LONGLONG);       // x86:8        x64:8  
        i = sizeof(HANDLE);         // x86:4        x64:8  
        i = sizeof(HWND);           // x86:4        x64:8  
        i = sizeof(bool);           // x86:1        x64:1  
        i = sizeof(char);           // x86:1        x64:1  

    并发和并行

    并行,是指两个或者多个事件在同一时刻发生;并发,是指两个或多个事件在同一时间间隔内发生,在操作系统中,并发是指有几个程序都处于启动运行和运行完毕之间,而且几个程序都是在同一CPU上,但是任意时刻点只有一个程序在CPU上运行。
    并发程序之间,除了竞争某一相同资源,例如处理器,缓冲区,变量等等之外,还存在直接制约,体现为某一程序需要另一个程序的计算结果。
    网络服务器上,并发指的是同一时刻能处理的连接数,比如服务器能建立1000个tcp连接,即服务器同时维护1000个socket,并发树即为1000.
    并行强调同时进行,并发则可以使用时间片来间隔实现。

    效率问题

    实际上,这个可以考虑为并行和并发的效率问题,并行当然可以提升效率,但是并发则不然。
    对于单核CPU,如果能够使用单线程较好的利用CPU,那么效率较高,而使用多线程并发,则存在等待时间,此时效率不一定高
    而对于多核CPU,如果能够使用多线程并行执行任务,那么效率比单线程要高。

    展开全文
  • springboot单线程定时任务很简单: 1. 在项目启动类上加@EnableScheduling注解 只有加了这个注解,才能扫描到@Scheduled注解, 定时器才会起作用 @SpringBootApplication @EnableScheduling//允许使用定时器 public...

    springboot单线程定时任务很简单:

     1. 在项目启动类上加@EnableScheduling注解

    只有加了这个注解,才能扫描到@Scheduled注解, 定时器才会起作用

    @SpringBootApplication
    @EnableScheduling//允许使用定时器
    public class SpringbootScheduledApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringbootScheduledApplication.class, args);
        }
    }

    2.定义一个类,加@component,类中的方法加@Scheduled注解,定时器就定义好了

    @component,将该类加入springboot 的 been 中,是spring可以扫描到该类

    @Scheduled(cron="*****?") cron表达式,指定任务在特定时间执行;

    @Scheduled(fixedRate=1000 * 60 *60 )  从第一次开始执行算起, 1000 * 60 *60ms 后执行第二次;

    @Scheduled(fixedDelay =1000 * 60 *60 )  从第一次执行完算起, 1000 * 60 *60ms 后执行第二次;

    @Component
    public class SchedualedTask {
    
        private Log log = LogFactory.getLog(SchedualedTask.class);
        
        //定时器1.
    //    @Scheduled(fixedRate = 1000*60*60)
        @Scheduled(fixedDelay = 1000*10)
        public void task1(){
            for (int i = 0; i < 100; i++) {
                log.info("task1================================================================="+i);
            }
        }
    
        //定时器2.
        @Scheduled(fixedDelay = 1000*10)
        public void task2(){
            for (int i = 0; i < 100; i++) {
                log.info("task2================================================================="+i);
            }
        }
    
    }

    运行结果,定时器1和2,单线程串行执行

    如何实现多线程呢

    1.在上面代码的基础上,重新定义一个类,实现 SchedulingConfigurer,在重写的方法中,调用定时器任务注册器scheduledTaskRegistrar,setScheduler() 传入一个新的线程池,自己可以定义线程池的size. 默认的线城池为SingleThreadScheduledExecutor,所以为单线程

    @Configuration
    //定时任务调用一个线程池中的线程。
    public class ScheduleConfig implements SchedulingConfigurer {
        @Override
        public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
            //参数传入一个size为10的线程池
            scheduledTaskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
        }
    }

    这样重新启动项目,我们的定时任务就会多线程并行执行了.

    附上简单案例的代码 GitHub https://github.com/nokekang/springboot-scheduled

    希望对初学者有所帮助

    展开全文
  • 单例在多线程下是安全的? 多例在多线程下是安全的? Tomcat每个请求都会在一个线程中执行,那所有的java代码是否都要考虑线程安全问题? 3.1. Spring单例模式下要不要考虑?看看平时的代码是怎么写的? 3.2. ...
    1. 单例在多线程下是安全的?
    2. 多例在多线程下是安全的?
    3. Tomcat每个请求都会在一个线程中执行,那所有的java代码是否都要考虑线程安全问题?
      3.1. Spring单例模式下要不要考虑?看看平时的代码是怎么写的?
      3.2. Struts2多例模式下要不要考虑?看看平时的代码是怎么写的?
    4. 单例在单线程下是安全的?
    5. 多例在单线程下是安全的?

    结论:
    一个对象是单例还是多例,与它是否是线程安全的,没有什么关系,没有关系!!!
    一个对象不管是多例还是单例,当多个线程同时访问一个对象(一个对象)的时候,都要考虑安全问题。

    最终一个对象是单例还是多例,就看他new了几个对象,而且只能决定对象的个数,不能绝对对象是否线程安全。
    一个对象是不是线程安全的,只看它的写法,与创建几个对象(单例和多例)没有关系,它是线程安全的就是线程安全的,你创建一个和创建100个,它就是线程安全的。
    展开全文
  • 单例模式在单线程多线程下的写法

    千次阅读 2020-10-08 19:51:11
    1、饿汉模式 public class HungrySingleton { private static final HungrySingleton instance = new HungrySingleton(); private HungrySingleton(){} ...饿汉模式在类加载的时候就完成了实例化,所以没有线程

    1、饿汉模式

    public class HungrySingleton {
    
        private static final HungrySingleton instance = new HungrySingleton();
    
        private HungrySingleton(){}
    
        public static HungrySingleton getInstance(){
            return instance;
        }
    }
    

    饿汉模式在类加载的时候就完成了实例化,所以没有线程同步问题

    2、懒汉模式

    public class LazySingleton {
        private static volatile LazySingleton instance = null;
    
        //加private避免在外部被实例化
        private LazySingleton(){}
    
        public static LazySingleton getInstance(){
            if (instance == null){
                instance = new LazySingleton();
            }
            return instance;
        }
    }
    

    适用于单线程,由于当线程1执行完 if (instance == null)后,还没开始new对象,线程2可能已经通过了这个判断并且已经实例化了对象,这时候就会产生多个对象

    3、懒汉模式(加锁)

    public class LazySingleton {
    
        //加上volatile关键字保证instance在所有线程中同步(操作可见性)
        private static volatile LazySingleton instance = null;
    
        //加private避免在外部被实例化
        private LazySingleton(){}
    
        //加synchronized同步
        public static synchronized LazySingleton getInstance(){
            if (instance == null){
                instance = new LazySingleton();
            }
            return instance;
        }
    }
    

    适用于多线程。在原基础上加了双重锁(volatile和synchronized)可以保证在多线程环境下的安全问题

    展开全文
  • 即便setUsesThreadedAnimation:YES,setIndeterminate:NO,spinning类型的进度条还是无法在单线程中启动?即便setUsesThreadedAnimation:NO,setIndeterminate:YES,bar类型的进度条还是无法在多线程中启动?  
  • SpringBoot使用@scheduled定时执行任务的时候是在一个单线程中,如果有个任务,其中一个任务执行时间过长,则有可能会导致其他后续任务被阻塞直到该任务执行完成。也就是会造成一些任务无法定时执行的错觉。 可以...
  • 同步还是异步,单线程还是多线程是我们软件开发中经常面临的设计选择,只有准确的区分它们之间的优缺点,才能根据我们的实际应用场景作出正确选择。它们两两组合一共有四种模式,下面就我自己的理解做一些总结分析。...
  • 这里把之前看过的几个ServerSocket的例子给放在这里.例子看看运行一下,修改一下部分内容感觉还是有些收获的,因为调试... * 单线程的,仅仅是能够应答连接的客户就立即断开连接了. */ import java.io.BufferedOutputStr
  • 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。...多线程是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务, 也...
  • 文章目录单 Reactor 单线程工作原理示意图方案说明方案优缺点分析优点缺点使用场景单 Reactor 多线程工作原理示意图方案说明方案优缺点分析优点缺点主从 Reactor 多线程工作原理示意图方案说明方案优缺点分析优点...
  • 单线程多线程的区别

    万次阅读 2017-11-27 11:03:18
    什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括...而一个进程又是由线程所组成的。 什么是线程线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区
  • Java单线程多线程

    千次阅读 2019-03-08 18:17:52
    在我们了解单线程多线程之前,我们必须搞清楚什么是进程。 一个运行起来的程序就是一个进程! 那程序又是什么呢? 对程序的通俗定义就是:一段可执行的代码。 当我们执行一段Java程序时,就在java虚拟机(JVM)中...
  • Ajax是单线程还是多线程

    千次阅读 2019-07-08 15:27:22
    之所以我们可以利用Ajax做到多线程,这取决于Web服务器,服务端使用多线程处理请求。 然后再明确一点:浏览器是多进程的。如图,google浏览器每打开一个tab标签页就会有一个子进程。 因为JS运行在浏览器中,是...
  • Redis是单线程还是多线程问题 在学习redis的过程中,很多文章都说redis是单线程,但在官方给出的说明中显示,redis6.0已经引入了多线程,对此我找了许多文档,将学习过程整理记录下来。 1、Redis单线程 在一开始的...
  • //前台线程 进程结束后,任务执行完毕以后,线程才结束 { ThreadStart threadStart1 = () => { Console.WriteLine($"****************btnThread_Click End {Thread.CurrentThread.ManagedThreadId.ToString...
  • 场景: Server: springboot 开发的一个 web 项目 ... client:使用 HttpClient 分别在单线程多线程环境下测试某个模块的性能 问题: 1.多线程单线程效率基本没差别 2.CPU使用率很低
  • 单线程多线程的区别

    千次阅读 2019-05-22 22:33:21
    前端精髓每日为你推送假设业务场景中有一组互不相关的任务需要完成,现行的主流方法有以下两种。单线程串行依次执行。多线程并行完成。如果创建多线程的开销小于并行执行,那么多线程...
  • 单线程多线程读取文件

    千次阅读 2017-09-06 15:05:35
    //实验个线程读取个文件和单个线程读取个文件//当文件数量是2-3个时,单线程比多线程更快,可能是没有创建线程之类的开销//文件数量增加到10个以后,个线程稍微快一点,但是并没有快多少//按照网上的说法...
  • 多线程并不总是比单线程优,多线程可能会引入其他问题(例如:两个线程同时调用一个类里的同一个方法时,可能出现死锁的情况)。  你可以这样理解 对应一个客户的一个页面请求处理的php 是单线程处理的, 这样一来...
  • JavaScript是多线程还是单线程

    万次阅读 多人点赞 2018-04-19 16:54:28
    那么JavaScript是单线程还是多线程?通过查资料总结了JavaScript运行的原理。如下:一、为什么JavaScript是单线程?JavaScript语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript...
  • 分别使用单线程多线程把一个文件夹下的饿一百张图片复制到另一个文件夹下,比较它们的处理时间 使用单线程: package lesson19; import java.io.File; import java.io.FileInputStream; import java.io....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,184
精华内容 24,873
关键字:

单线程多线程