`
xieyj
  • 浏览: 102765 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Thread的调用

阅读更多

    在java里面创建线程new Thread().start(),在这里面先调用Thread.java的init()进行了初始化,然后调用了本地方法 start0(),这个方法实际上调用了hotspot\src\share\vm\prims\jvm.cpp文件里的JVM_StartThread方法。 在上面方法里new JavaThread(),这是jvm里面区分的线程类型。创建时候传进入一个函数指针thread_entry,这个函数将调用 用户实现的run()方法。在JVM_StartThread()最后通过Thread::start(native_thread)启动一个系统线程来执行用户创建的方法。 系统线程首先执行的是JavaThread里面的run方法,run方法进行一系列初始化后,调用thread_main_inner,这个就调用了上面传入 的thread_entry,真正的用户run方法由此开始执行。thread_main_inner最后执行退出及delete this ,删除JavaThread数据结构。
    在这一连串调用中,用到了一些技巧。通过os::create_thread(this, thr_type, stack_sz)将启动线程的系统调用和javaThread联系起来。  就象下面的做法
      class Thread{
              public:
                      Thread();
                      ~Thread();
                      void start();
                      virtual void run() = 0 ;
              private:
                       HANDLE thread_handle ;
       };

       class CommThread:public Thread{
             public:
                    CommThread(){}
                    ~CommThread(){}
                    virtual void run();
       };
   通过继承Thread类,就把一个线程变成个线程对象,更好体现了面向对象的编程思想。
      Thread的实现
      Thread::Thread(){
               unsigned thread_id;
               thread_handle =
                          (HANDLE)_beginthreadex(NULL,
                                                                   NULL,
                                                                   (unsigned (__stdcall *)(void*)) th_start,
                                                                   this,
                                                                   CREATE_SUSPENDED ,
                                                                   &thread_id);
      }

      Thread::~Thread(){
      }

      void Thread::start(){
                ResumeThread(thread_handle);
      }
   思路还是比较简单,在创建对象时候即开始一个堵塞线程,直到调用start时候才开始运行它。

分享到:
评论

相关推荐

    AsyncTask用法

     onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。  doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行...

    多线程gdb调试思路说明

    函数thread_command是被命令thread调用的,切换当前线程最终调用的函数是switch_to_thread,这个函数会先将当前调试线程变量inferior_ptid,然后对寄存器和frame缓冲进行刷新。 函数thread_apply_command被命令...

    QT调用dll和MFC调用QT的dll

    在软件开发中,有时我们需要在QT环境中调用动态链接库(DLL),或者将QT编译成DLL供MFC应用使用。这篇内容将深入探讨如何实现这些操作。 1. QT调用DLL: - 创建DLL:首先,你需要在QT环境中创建一个DLL项目,定义...

    MFC进程与线程Demo程序.zip

    线程优先级由`THREAD_PRIORITY_*`常量表示,如`THREAD_PRIORITY_NORMAL`、`THREAD_PRIORITY_ABOVE_NORMAL`等。线程的优先级会影响其在CPU调度中的权重,但并不保证绝对的执行顺序,因为线程调度还受到其他因素影响。...

    C#多线程之Thread中Thread.Join()函数用法分析

    当NewThread调用Join方法的时候,MainThread就被停止执行, 直到NewThread线程执行完毕。 Thread oThread = new Thread(new ThreadStart(oAlpha.Beta)); oThread.Start(); while (!oThread.IsAlive) //表示线程当

    C++11/14 线程调用类对象和线程传参的方法

    线程调用类对象 在前面的示例中,我们为线程任务使用了通常的函数。实际上,我们可以使用任何可调用对象或者lambda函数,如下调用类对象的例子: #include #include <thread> class MyFunctor { public: void ...

    Linux下的系统调用和进程

    `kernel_thread`函数是创建内核线程的一个关键函数,它允许在内核空间中启动一个新的线程,执行特定的函数并传入参数。 #### 结构体、宏与系统调用实现 Linux系统的高效运行依赖于精心设计的数据结构和宏定义。...

    C#跨线程调用控件的四种方式

    在C#编程中,由于GUI(图形用户界面)控件是由主线程管理的,因此在其他线程中直接操作这些控件会引发"Cross-thread operation not valid"的异常。为了解决这个问题,开发者需要使用特定的方法来跨线程安全地调用...

    C#创建线程带参数的方法

    使用ParameterizedThreadStart,调用 System.Threading.Thread.Start(System.Object) 重载方法时将包含数据的对象传递给线程。 注意传递的参数只能是object类型,不过可以进行强制类型转换。 Thread thread

    线程及方法调用

    在Java中,线程的创建主要有两种方式:继承`java.lang.Thread`类和实现`java.lang.Runnable`接口。 **继承Thread类创建线程:** 当创建一个Thread的子类并重写`run()`方法时,`run()`方法内部的代码定义了线程的...

    C#多线程之Thread中Thread.IsAlive属性用法分析

    `Thread`类是.NET框架提供的用于创建和管理线程的核心类。其中,`Thread.IsAlive`属性是一个非常重要的成员,它允许开发者检查线程的当前状态,以确定线程是否已经启动并且仍在运行。在理解`Thread.IsAlive`属性的...

    Thread 线程调用

    在C#编程环境中,线程(Thread)是一个重要的概念,它是多任务并行处理的基础。线程允许程序同时执行多个独立的代码段,从而提高了应用程序的效率和响应性。线程调用是C#中实现并发操作的关键技术,特别是在开发高...

    ThreadX中文学习手册

    - **Picokernel结构**:ThreadX采用了Picokernel结构,这是一种非层级化的内核设计方法,所有的服务直接进入内核核心,减少了层间调用的开销,从而实现了更快的命令执行速度和转换效率。 - **ANSI C源代码**:Thread...

    Assistant API的接口调用封装

    使用python调用chatgpt的Assistant API,我对几种常用的接口进行了封装,只需传入key即可调用,包含创建助理(Assistant ,列出助理(Assistant ),#创建线程 ,#聊天,#查询消息

    不同线程间的调用处理

    线程池(Thread Pool)是预先创建的一组可重用线程,当有新的任务提交时,线程池会从空闲线程中选择一个执行任务,而不是每次都创建新的线程。线程池的主要优点包括资源的有效利用、线程的管理简化、减少系统资源的...

    多线程调用dll

    本话题将深入探讨如何在C++环境下通过多线程调用DLL(动态链接库)中的函数。 DLL(Dynamic Link Library)是Windows操作系统提供的一种共享代码的方式,它可以被多个应用程序同时使用,以节省内存和提高性能。DLL...

    Qt C++静态库编写和调用示例

    总结来说,Qt C++静态库的创建和使用涉及编写库代码、配置项目文件、编译生成静态库以及在其他项目中引用并调用这些库。通过这种方式,你可以有效地组织和重用代码,同时降低应用程序的复杂性。在实际开发中,根据...

    webservice8 异步调用webservice

    在上述示例中,我们创建了一个名为MyService的Web服务,其中包含一个getName方法,这个方法模拟了长时间执行的情况,通过Thread.sleep(5000)延迟5秒。在服务的配置文件services.xml中,定义了MyService的服务名、...

    libc库和系统调用

    ### libc库和系统调用详解 #### 一、libc库简介 libc库,全称为Standard C Library(标准C库),是遵循ANSI C标准的一种实现。它为C语言程序员提供了基本的操作功能,如文件处理、字符串操作等。尽管libc遵循的是...

Global site tag (gtag.js) - Google Analytics