`
北极的。鱼
  • 浏览: 159109 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

多线程的一点小感悟

阅读更多

先看一个简单的例子(从网上扒下来的。)


using System;
using System.Threading;
// Simple threading scenario: Start a static method running
// on a second thread.
public class ThreadExample
{
    // The ThreadProc method is called when the thread starts.
    // It loops ten times, writing to the console and yielding 
    // the rest of its time slice each time, and then ends.
    public static void ThreadProc()
    {
        for (int i = 0; i < 10; i++)
        {
            Console.WriteLine("ThreadProc: {0}", i);
            // Yield the rest of the time slice.
            Thread.Sleep(1000);
        }
    }

    public static void Main()
    {
        Console.WriteLine("Main thread: Start a second thread.");
        // The constructor for the Thread class requires a ThreadStart 
        // delegate that represents the method to be executed on the 
        // thread. C# simplifies the creation of this delegate.
        Thread t = new Thread(new ThreadStart(ThreadProc));
        // Start ThreadProc. On a uniprocessor, the thread does not get 
        // any processor time until the main thread yields. Uncomment 
        // the Thread.Sleep that follows t.Start() to see the difference.
        t.Start();
        //Thread.Sleep(0);

        for (int i = 0; i < 4; i++)
        {
            Console.WriteLine("Main thread: Do some work.");
            Thread.Sleep(1000);
        }

        Console.WriteLine("Main thread: Call Join(), to wait until ThreadProc ends.");
        if (t.ThreadState == ThreadState.Running)
        {
            t.Join();
        }

        Console.WriteLine("Main thread: ThreadProc.Join has returned. Press Enter to end program.");
        Console.ReadLine();
    }
}

这是一个很简单的小例子。不过能说明多线程工作的原理(本人刚涉及多线程,如有不对,请各位看官跟贴指出哈~~~~)。

首先呢,还是结合当年大学里学的操作系统原理,讲一下基础知识。


1)进程和线程

     简而言之,一个程序至少有一个进程,一个进程至少有一个线程. 进程是程序向操作系统申请资源的基本单位。而线程是不能向操作系统申请资源的,但是他可以和其他线程一起利用父进程申请到的部分资源。正因为要和其他线程一起使用资源,所以必然会发生冲突。这里为了解决冲突呢,我们一般是会对资源进行加锁操作,控制同步基元等(这是后话,这里着重讲解线程的基础知识)。线程是进程中执行运算的基本单位。

2)创建新线程

     线程的创建和销毁都可以在另一个线程中执行操作。比如,UI线程,你们都懂的哈~~~~嘎嘎

3)多线程的执行

     创建了多线程程序以后,很多人会思考多线程的执行方式。在这里,我依旧援引操作系统原理那门课的理论(哈哈~别骂我哈,各位看官。我们大学的操作系统原理是全国有名的,那位老教授爷爷给我们讲课的那本书都是他自己写的,很猛的)。CPU其实是这么工作的,系统当前维护的所有进程中的线程,默认情况下都是有相同的获得CPU运行时间的权力。这里要解释下,什么叫CPU运行时间?咳咳,其实呢,我们看到的某个程序一直在运行。比如是你在windows操作系统下复制一个文件,你会看到有一个动画,好像一页一页的纸从一个文件夹到另一个文件夹。对,我说的就是那个。那个你看上去是一连贯的动作,其实他不是连贯的,只是现代的计算机的硬件设备实在太先进的,CPU处理速度太快。人类的肉眼根本看不出来其中的间隙。那么我来帮大家解释下这个过程。其实操作系统的所有线程都在CPU上跑(一般情况下有几十上百,甚至上千个线程,那是很正常的)。这些线程,都是要占用CPU,这个不必我说了吧(当然还占用其他系统资源,比如内存!)。那么,这么多线程同时占用CPU,怎么办呢?于是操作系统就把CPU的占用划分成很多的时间片。每个时间片里面执行一个线程。这个时间片一过,那么刚执行的线程就移出CPU的执行,下一个线程进入。如此往返,确保系统维护的所有线程都能被分配到CPU。这个就是CPU时间片(也称时间轮)。(当然,刚说的线程的交替获得CPU时间片的过程中,还涉及到保护现场等的复杂操作,有兴趣的同学可以仔细阅读下操作系统原理。)刚说了,默认情况下系统中各线程获得CPU的时间片的概率是相同的,不过呢,我们可以改变某个线程的权值,提高他的执行优先级。那么这个线程就比其他线程具有更大的获得CPU执行时间片的概率了。额,貌似有点讲深了。嗯,我们先不管各线程的权值不一样的情况,默认各线程的权值都相同,就是获得CPU时间轮的概率相同。那么这个情况下,各个线程是一同在CPU上跑的,一个线程跑的时间片到了,就移出CPU,下个线程进来,各线程交替获得CPU。看上面的程序程序执行结果就能看出来了。不过,如果我把主线程的sleep那段代码注销掉,会怎么样呢?那么理论上是会先把主线程的代码全部执行结束,然后去执行新线程的代码。可是多执行几次看看结果。却发现,不完全是这样的,执行的结果,会不一样。微软的解释是这样的:各位童鞋,这个是正常的情况,相同的多线程程序是会出现一些小的不同的执行结果的。谁也不能保证多线程的程序,执行结果是怎么样的,结果是不可预测的。所以虽然,现代程序有很都需要多线程的处理,但是,我们建议,不到万不得已,请不要使用多线程。因为极容易导致一些不可预知的,且灾难性的后果。

分享到:
评论

相关推荐

    JAVA运用多线程实现碰撞的小球

    通过JAVA运用多线程控制球的运动,通过窗口中的滑条,对球的大小和颜色进行选择后,随机从窗口左右两方择一进入,小球在遇到障碍或边界后会折回。

    java 多线程的小游戏 Java 课程设计 Java毕业设计 多线程的小游戏 经典

    Java多线程小游戏是学习Java并发编程的一个经典实践案例,它可以帮助开发者深入理解线程的创建、同步、通信以及管理。在这个课程设计或毕业设计项目中,学生通常会被要求实现一个能够展示多线程特性的游戏,比如经典...

    C#多线程互斥实例 多线程获取同一变量

    在编程领域,多线程是实现并发执行任务的重要机制,特别是在现代计算机系统中,多核处理器使得多线程成为提高程序性能的关键手段。C#语言提供了丰富的多线程支持,让我们能够编写出高效的多线程应用程序。在这个"多...

    pb9多线程控件,能够真实实现多线程

    标题中的“pb9多线程控件”指的是在PowerBuilder 9.0(PB9)环境中,使用的一种能够实现真正多线程功能的组件或技术。PowerBuilder是一款经典的面向对象的开发工具,主要用于构建数据库应用系统。在PB的早期版本中,...

    Qt中利用OpenCV2.4.4多线程打开多摄像机

    Qt中利用OpenCV2.4.4多线程打开多摄像机 每个线程处理一个摄像机,从中拿出帧显示...只是个多线程的小例子,还有很多不足之处,有待各位完善。 注意:pro文件中的include和lib文件目录需要根据自己电脑上的情况重新配置

    基于SpringBoot和POI实现单线程和多线程导出Excel.zip

    基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip基于SpringBoot和POI实现单线程和多线程导出Excel.zip...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例),可直接运行

    在.NET框架中,C#语言提供了强大的多线程支持,使得开发者可以充分利用现代多核处理器的优势,实现并行处理和高效能编程。本资源包含六个C#.NET多线程的实例,涵盖了多线程的基本使用到更高级的概念,如线程互斥。...

    c#编写串口通讯代码 多线程实现.rar_C#串口_c# 串口多线程_c#多线程_串口多线程_串口通信

    串口通信的实现,编程环境为C#,实现技术采用了多线程方式

    PB多线程实现

    本文将详细探讨PB(包括PB9、PB12.5以及PB.NET)实现多线程的方法。 一、PB9的多线程实现 在PB9中,虽然官方并未直接支持多线程,但开发者可以通过使用Windows API函数来实现。一种常见的方式是创建一个新的窗口类...

    C#多线程读写sqlite

    在C#编程中,多线程技术常用于提高应用程序的执行效率,特别是在处理数据库操作时。SQLite是一款轻量级、嵌入式的关系型数据库,它广泛应用于桌面应用、移动设备和Web开发。当多线程环境对SQLite进行读写操作时,...

    .NET多线程实例

    .NET框架的多线程技术是开发高性能应用程序的关键组成部分,特别是在处理并发操作、并行计算以及UI更新时。在.NET 2.0版本中,多线程功能已经得到了充分的优化和增强,允许开发者构建出更加高效的应用程序。下面将...

    C# 多线程实例多线程实例多线程实例

    在编程领域,多线程是实现并发执行任务的关键技术,特别是在C#这样的语言中,它提供了丰富的多线程支持。本文将深入探讨C#中的多线程实例,以帮助开发者理解如何有效地利用多核处理器资源,提高程序的执行效率。 多...

    12.1 Qt5多线程:多线程及简单实例

    在编程领域,尤其是在开发高效、响应迅速的应用程序时,多线程技术扮演着至关重要的角色。Qt5框架提供了一种方便的方式来实现多线程,它允许开发者在不同的线程中执行任务,从而避免主线程(GUI线程)因处理耗时操作...

    Java多线程设计模式上传文件

    Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...

    Qt 多线程及简单实例 demo

    Qt 多线程及简单实例 demo。 多线程的几大特点: 1.多线程的执行顺序无法保证,与操作系统的调度策略和线程优先级等因素有关。 2.多线程的切换可能发生在任何时刻、任何地点。 3.多线程对代码的敏感度高,因此对...

    五个多线程同步应用小程序

    本文将深入探讨在.NET框架中用于多线程同步的三个主要工具:Monitor、Mutex和EventWaitHandle,并结合提供的"五个多线程同步应用小程序",解释它们的应用场景和使用方法。 首先,我们来看Monitor类。Monitor是.NET...

    多线程导入excel 数据

    - **并发策略**:可以采用“任务分割”策略,将大文件拆分成多个小任务,每个任务由一个线程处理。通过`ExecutorService`提交任务到工作队列,实现并行处理。 - **线程池管理**:使用`ExecutorService`可以更有效...

    java 多线程操作数据库

    ### Java多线程操作数据库:深入解析与应用 在当今高度并发的应用环境中,Java多线程技术被广泛应用于处理数据库操作,以提升系统的响应速度和处理能力。本文将基于一个具体的Java多线程操作数据库的应用程序,深入...

    stm32单片机多线程实例

    多线程是实现复杂任务并发执行的关键技术,能够提高资源利用率,优化系统响应时间。在STM32上实现多线程,通常会借助实时操作系统(RTOS)如RT-Thread。 RT-Thread是一个轻量级、开源的实时操作系统,它为STM32等微...

    vb多线程程序

    本教程通过一个简单的小例子来讲解如何在VB 6.0中实现多线程。 首先,我们要了解线程是什么。线程是程序中的执行流程,每个线程负责一部分任务,这样可以使得程序在等待某个任务完成时,其他任务仍然能够继续执行。...

Global site tag (gtag.js) - Google Analytics