您好,欢迎访问三七文档
当前位置:首页 > 中学教育 > 初中教育 > Java 多线程编程精编4篇
参考资料,少熬夜!Java多线程编程精编4篇【导读指引】三一刀客最漂亮的网友为您整理分享的“Java多线程编程精编4篇”文档资料,供您学习参考,希望此文档对您有所帮助,喜欢就分享给朋友们吧!Java多线程编程1一、问题的提出问题的引出编写一个耗时的单线程程序:新建一个基于对话框的应用程序singlethread,在主对话框idd_singlethread_dialog添加一个按钮,id为idc_sleep_six_second,标题为“延时6秒”,添加按钮的响应函数,代码如下:voidcsinglethreaddlg::onsleepsixsecond(){sleep(6000);//延时6秒}编译并运行应用程序,单击“延时6秒”按钮,你就会发现在这6秒期间程序就象“死机”一样,不在响应其它消息。为了更好地处理这种耗时的操作,我们有必要学习——多线程编程。多线程概述进程和线程都是操作系统的概念。进程是应用程序的执行实例,每个进程是由私有的虚拟地址空间、代码、数据和其它各种系统资源组成,进程在运行过程中创建的资源随着进程的终止而被销毁,所使用的系统资源在进程终止时被释放或关闭。线程是进程内部的一个执行单元。系统创建好进程后,实际上就启动执行了该进程的主执行线程,主执行线程以函数地址形式,比如说main或winmain函数,将程序的启动点提供给windows系统。主执行线程终止了,进程也就随之终止。每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在应用程序中创建其它线程,多个线程并发地运行于同一个进程中。一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源,所以线程间的通讯非常方便,多线程技术的应用也较为广泛。多线程可以实现并行处理,避免了某项任务长时间占用cpu时间。要说明的一点是,对于单处理器(cpu)的,为了运行所有这些线程,操作系统为每个独立线程安排一些cpu时间,操作系统以轮换方式向线程提供时间片,这就给人一种假象,好象这些线程都在同时运行。由此可见,如果两个非常活跃的线程为了抢夺对cpu的控制权,在线程切换时会消耗很多的cpu资源,反而会降低系统的性能。这一点在多线程编程时应该注意。win32sdk函数支持进行多线程的程序设计,并提供了操作系统原理中的各种同步、互斥和临界区等操作。visualc++参考资料,少熬夜!中,使用mfc类库也实现了多线程的程序设计,使得多线程编程更加方便。win32api对多线程编程的支持win32提供了一系列的api函数来完成线程的创建、挂起、恢复、终结以及通信等工作。下面将选取其中的一些重要函数进行说明。1、handlecreatethread(lpsecurity_attributeslpthreadattributes,dworddwstacksize,lpthread_start_routinelpstartaddress,lpvoidlpparameter,dworddwcreationflags,lpdwordlpthreadid);该函数在其调用进程的进程空间里创建一个新的线程,并返回已建线程的句柄,其中各参数说明如下:lpthreadattributes:指向一个security_attributes结构的指针,该结构决定了线程的安全属性,一般置为null;dwstacksize:指定了线程的堆栈深度,一般都设置为0;lpstartaddress:表示新线程开始执行时代码所在函数的地址,即线程的起始地址。一般情况为(lpthread_start_routine)threadfunc,threadfunc是线程函数名;lpparameter:指定了线程执行时传送给线程的32位参数,即线程函数的参数;dwcreationflags:控制线程创建的附加标志,可以取两种值。如果该参数为0,线程在被创建后就会立即开始执行;如果该参数为create_suspended,则系统产生线程后,该线程处于挂起状态,并不马上执行,直至函数resumethread被调用;lpthreadid:该参数返回所创建线程的id;如果创建成功则返回线程的句柄,否则返回null。2、dwordsuspendthread(handlehthread);该函数用于挂起指定的线程,如果函数执行成功,则线程的执行被终止。3、dwordresumethread(handlehthread);该函数用于结束线程的挂起状态,执行线程。4、voidexitthread(dworddwexitcode);该函数用于线程终结自身的执行,主要在线程的执行函数中被调用。其中参数dwexitcode用来设置线程的退出码。5、boolterminatethread(handlehthread,dworddwexitcode);一般情况下,线程运行结束之后,线程函数正常返回,但是应用程序可以调用terminatethread强行终止某一线程的执行。各参数含义如下:hthread:将被终结的线程的句柄;dwexitcode:用于指定线程的退出码。使用terminatethread()终止某个线程的执行是不安全的,可能会引起系统不稳定;虽然该函数立即终止线程的执行,但并不释放线程所占用的资源。因此,一般不建议使用该函数。6、boolpostthreadmessage(dwordidthread,uintmsg,wparamwparam,lparamlparam);该函数将一条消息放入到指参考资料,少熬夜!定线程的消息队列中,并且不等到消息被该线程处理时便返回。idthread:将接收消息的线程的id;msg:指定用来发送的消息;wparam:同消息有关的字参数;lparam:同消息有关的长参数;调用该函数时,如果即将接收消息的线程没有创建消息循环,则该函数执行失败。32api多线程编程例程例程1[multithread1]一个简单的线程。注意事项:关键字:volatile是要求c++编译器不要自作聪明的把变量缓冲在寄存器里。因为该变量可能会被意外的修改。(多个线程或其他原因)如从串口读数据的场合,把变量缓冲在寄存器里,le也加上,以保证从内存中读取变量的值。终止线程:windows终止线程运行的四种方法终止线程运行若要终止线程的运行,可以使用下面的方法:•线程函数返回(最好使用这种方法)。•通过调用exitthread函数,线程将自行撤消(最好不要使用这种方法)。•同一个进程或另一个进程中的线程调用terminatethread函数(应该避免使用这种方法)。•包含线程的进程终止运行(应该避免使用这种方法)。下面将介绍终止线程运行的方法,并且说明线程终止运行时会出现什么情况。线程函数返回始终都应该将线程设计成这样的形式,即当想要线程终止运行时,它们就能够返回。这是确保所有线程资源被正确地清除的唯一办法。如果线程能够返回,就可以确保下列事项的实现:•在线程函数中创建的所有c++对象均将通过它们的撤消函数正确地撤消。•操作系统将正确地释放线程堆栈使用的内存。•系统将线程的退出代码(在线程的内核对象中维护)设置为线程函数的返回值。•系统将递减线程内核对象的使用计数。使用exitthread函数可以让线程调用exitthread函数,以便强制线程终止运行:voidexitthread(dworddwexitcode);该函数将终止线程的运行,并导致操作系统清除该线程使用的所有操作系统资源。但是,c++资源(如c++类对象)将不被撤消。由于这个原因,最好从线程函数返回,而不是通过调用exitthread来返回。当然,可以使用exitthread的dwexitthread参数告诉参考资料,少熬夜!系统将线程的退出代码设置为什么。exitthread函数并不返回任何值,因为线程已经终止运行,不能执行更多的代码。使用terminatethread函数调用terminatethread函数也能够终止线程的运行:boolterminatethread(handlehthread,dworddwexitcode);与exitthread不同,exitthread总是撤消调用的线程,而terminatethread能够撤消任何线程。hthread参数用于标识被终止运行的线程的句柄。当线程终止运行时,它的退出代码成为你作为dwexitcode参数传递的值。同时,线程的内核对象的使用计数也被递减。注意terminatethread函数是异步运行的函数,也就是说,它告诉系统你想要线程终止运行,但是,当函数返回时,不能保证线程被撤消。如果需要确切地知道该线程已经终止运行,必须调用waitforsingleobject或者类似的函数,传递线程的句柄。设计良好的应用程序从来不使用这个函数,因为被终止运行的线程收不到它被撤消的通知。线程不能正确地清除,并且不能防止自己被撤消。注意当使用返回或调用exitthread的方法撤消线程时,该线程的内存堆栈也被撤消。但是,如果使用terminatethread,那么在拥有线程的进程终止运行之前,系统不撤消该线程的堆栈。microsoft故意用这种方法来实现terminatethread。如果其他仍然正在执行的线程要引用强制撤消的线程堆栈上的值,那么其他的线程就会出现访问违规的问题。如果将已经撤消的线程的堆栈留在内存中,那么其他线程就可以继续很好地运行。此外,当线程终止运行时,dll通常接收通知。如果使用terminatethread强迫线程终止,dll就不接收通知,这能阻止适当的清除,在进程终止运行时撤消线程。当线程终止运行时,会发生下列操作:•线程拥有的所有用户对象均被释放。在windows中,大多数对象是由包含创建这些对象的线程的进程拥有的。但是一个线程拥有两个用户对象,即窗口和挂钩。当线程终止运行时,系统会自动撤消任何窗口,并且卸载线程创建的或安装的任何挂钩。其他对象只有在拥有线程的进程终止运行时才被撤消。•线程的退出代码从still_active改为传递给exitthread或terminatethread的代码。•线程内核对象的状态变为已通知。•如果线程是进程中最后一个活动线程,系统也将进程视为已经终止运行。•线程内核对象的使用计数递减1。当一个线程终止运行时,在与它相关联的线程内核对象的所有未结束的引用关闭之前,该内核对象不会自动被释放。参考资料,少熬夜!一旦线程不再运行,系统中就没有别的线程能够处理该线程的句柄。然而别的线程可以调用getexitcodethread来检查由hthread标识的线程是否已经终止运行。如果它已经终止运行,则确定它的退出代码:boolgetexitcodethread(handlehthread,pdowrdpdwexitcode);退出代码的值在pdwexitcode指向的dword中返回。如果调用getexitcodethread时线程尚未终止运行,该函数就用still_active标识符(定义为0x103)填入dword。如果该函数运行成功,便返回true。线程的定义:例程2[multithread2]传送一个一个整型的参数到一个线程中,以及如何等待一个线程完成处理。dwordwaitforsingleobject(handlehhandle,dworddwmilliseconds);hhandle:为要监视的对象(一般为同步对象,也可以是线程)的句柄;dwmilliseconds:为hhandle对象所设置的超时值,单位为毫秒;当在某一线程中调用该函数时,线程暂时挂起,系统监视hhandle所指向的对象的状态。如果在挂起的dwmilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwmilliseconds毫秒,但hhandle所指向的对象还没有变成有信号状态,函数照样返回。参数dwmilliseconds有两个具有特殊意义的值:0和infinit
本文标题:Java 多线程编程精编4篇
链接地址:https://www.777doc.com/doc-12263959 .html