异步委托

异步委托
异步委托

线程是程序中独立的指令流。这个程序结构非常适合于有一个可识别的任务序列的程序,但程序常常需要同时完成多个任务。

一个线程等待客户的请求,成为监听线程。只要接收到请求,就把它传递给另一个工作线程,之后继续与客户通信。监听线程会立即返回,接受下一个客户发送的下一个请求。

线程是运行程序所必须的。

在.NET中,托管的线程有Thread类定义。托管的线程不一定映射为一个操作系统进程。使用ProcessThread类可以获得内部线程的信息,但在托管的应用程序中,通常最好使用托管的线程。

创建线程的一个简单方式是定义一个委托,异步调用它。委托使用线程池来完成异步任务。等待异步委托的结果的另一种方式是使用与IAsyncResult相关的等待句柄。等待委托的结果的第三中方式是使用异步回调。

使用Thread类可以创建和控制线程。在创建了Thread对象后,就就可以使用Start()方法启动线程了。但不能保证哪个结果先输出,线程由操作系统调度,每次哪个线程在前面都是不同的。

为了获得当前线程的名称,可以使用静态属性Thread.CurrentThread,获取当前线程的Thread 实例,访问Name属性,进行读取访问。线程也有一个托管的ID,也可以用ManagedThreadId 属性来读取它。

给线程传送数据:一种是使用带ParameterizedThreadStart委托参数的Thread构造函数,另一种方式是创建一个定制类,把线程的方法定义为实例方法,这样就可以初始化实例的数据,之后启动线程。要给线程传送数据,需要某个存储数据的类或结构。

只要有一个前台线程在运行,应用程序的进程就在运行。如果多个前台线程在运行,而Main 方法结束了,应用程序的进程就是激活的,直到所有前台线程完成其任务为止。

默认情况下,用Thread类创建的线程是前台线程。线程池中的线程总是后台线程。在用Thread类创建线程时,可以设置属性IsBackground,以确定该线程是前台还是后台线程。后台线程非常适合于完成后台任务。

操作系统根据优先级来调度线程,优先级高的线程在CPU上运行。线程如果在等待资源,就会停止运行,释放CPU。线程等待的原因有以下几个:响应睡眠指令、等待磁盘I/O的完成、等待网络包的到达。如果线程不主动释放CPU,线程调度器就会抢先安排该线程。如果线程有一个时间量,就可以继续使用CPU,如果优先级相同的多个线程等待使用CPU,线程调度器就会使用一个循环调度则鬼,将CPU逐个交给线程使用。如果线程是被其他的线程抢先了,它就会排在队列的最后。

在Thread类中,可以设置Priority属性,以影响线程的基本优先级。Priority属性需要一个ThreadPriority枚举定义的值,该值定义的级别有Highest、AboveNormal、BelowNormal和Lowest。

调用Thread对象的Start()方法,可以创建线程。但在调用Start()方法后,新线程仍不在Running 状态,而是在Unstarted状态。在操作系统的线程调度器选择了要运行的线程后,线程就会该为Running状态。读取Thread.ThreadState属性,就可以获得线程的当前状态。

使用Thread.Sleep()方法,会使线程处于WaitSleepJoin状态,在使用Sleep()方法定义的时间过后,线程就会被再次调用。

要停止一另一个线程,可以调用thread.Abort()方法。

线程池中的最大线程数是可以配置的。在双核CPU中,默认设置为50个工作线程和1000个I/O线程。

线程池使用起来很简单,但他有些限制:

线程池中的所有线程都是后台线程,如果进程中的所有前台线程都结束了,所有的后台线程就会停止。不能把线程池中的线程改为前台线程。

不能给线程池中的线程设置优先级或名称。

对于COM对象,线程池中的所有线程都是多线程单元线程。许多COM对象都需要单线程单元线程。

线程中的线程只能用于时间较短的任务。如果线程要一直运行(如Word的拼写检查器线程),就应使用Thread类创建一个线程。

线程问题:

竞太条件-----如果两个或多个线程访问相同的对象,或者访问不同步的共享状态,就会出现竞太条件。

Timer类

命名空间System.Threading:该命名空间中的Timer类提供了核心功能。在构造函数中,可以传递一个委托,该委托应在指定的时间隔后调用。

命名空间System.Timers: 该命名空间中的Timer类是一个组件,因为他派生于Component基类,因此,可以把它从工具箱拖放到服务器应用程序的界面设计上,这个Timer 类使用System.Threading.Timer,但提供了基于事件的机制,而不是委托。

命名空间System.Windows.Forms:使用System.Threading和System.Timers命名空间中的Timer类,可以从不是调用线程的另一个线程中调用回调函数或事件方法。Windows窗体空间绑定到创建线程上,对这个线程的会带哦是通过System.Windows.Forms命名空间中的Timer类完成的。

System.Web.UI命名空间中的Timer类是一个AJAX扩展,可以用于Web页面。

Windows服务

Windows服务指的是操作系统启动时可以自动打开的应用程序。

操作windows服务需要3中程序:服务程序、服务控制程序、服务配置程序。服务程序本身用于提供需要的功能。服务控制程序可以把控制请求发送给服务。例如开始、停止、暂停和继续。使用服务配置程序可以安装服务,这意味着服务不但要复制到文件系统中,还要写到注册表中,并配置为一个服务。.NET组件不需要把信息写入注册表,所以可以使用xcopy命令安装它们。但是服务的安装需要注册表配置。

java多线程试题答案

多线程 一.选择题 1.下列说法中错误地一项是() A.线程就是程序.线程是一个程序地单个执行流 B.多线程是指一个程序地多个执行流.多线程用于实现并发 2.下列哪个一个操作不能使线程从等待阻塞状态进入对象阻塞状态() A.等待阴塞状态下地线程被()唤 B.等待阻塞状态下地纯种被()中断 C.等待时间到 D.等待阻塞状态下地线程调用()方法 3.下列哪个方法可以使线程从运行状态进入其他阻塞状态() A. 4.下列说法中错误地一项是() A.一个线程是一个类地实例 B.线程从传递给纯种地实例()方法开始执行 C.线程操作地数据来自实例 D.新建地线程调用()方法就能立即进入运行状态 5.下列关于类提供地线程控制方法地说法中,错误地一项是() A.在线程中执行线程地()方法,则线程等待直到执行完成 B.线程通过调用()方法来中断其阻塞状态 C.若线程调用方法()返回值为,则说明正在执行中 D.()方法返回当前线程地引用 6.下列说法中,错误地一项是() A.对象锁在()语句执行完之后由持有它地线程返还 B.对象锁在()语句中出现异常时由持有它地线程返还 C.当持有锁地线程调用了该对象地()方法时,线程将释放其持有地锁 D.当持有锁地线程调用了该对象地构造方法时,线程将释放其持有地锁 7.下面地哪一个关键字通常用来对对象地加锁,从而使得对对象地访问是排他地 A. 二.填空题 . 在操作系统中,被称做轻型地进程是线程 . 多线程程序设计地含义是可以将一个程序任务分成几个并行地任务 . 在程序中,()方法地实现有两种方式:实现接口和继承类.多个线程并发执行时,各个线程中语句地执行顺序是确定地,但是线程之间地相对执行顺序是不确定地 中地对象锁是一种独占地排他锁 .程序中可能出现一种情况:多个线种互相等待对方持有地锁,而在得到对方地锁之前都不会释放自己地锁,这就是死锁b5E2R。 .线程地优先级是在类地常数和之间地一个值 .处于新建状态地线程可以使用地控制方法是()和(). .一个进程可以包含多个线程 三.简答题

第5章-多线程-补充案例

第五章补充案例 案例5-1继承Thread类创建多线程 一、案例描述 1、考核知识点 编号:00105002 名称:继承Thread类创建多线程 2、练习目标 ?掌握如何通过继承Thread类实现多线程的创建。 ?掌握Thread类中run()方法和start()方法的使用。 3、需求分析 在程序开发中,会遇到一个功能需要多个线程同时执行才能完成的情况。这时,可以通过继承线程类Thread,并重写Thread类中的run()方法来实现。为了让初学者熟悉如何创建多线程,在案例中将通过继承Thread类方式创建线程,并实现多线程分别打印0~99的数字的功能。 4、设计思路(实现原理) 1)自定义一个类Demo,使其继承Thread类。 2)在Demo类中重写run()方法,在run()方法内编写一个for循环,循环体内打印:“Demo:” +当前循环次数。 3)编写测试类Example01,在Example01类的main()方法中,创建一个Demo对象,并执 行其start()方法,接着编写一个for循环,循环体内打印:“main:”+当前循环次数。

二、案例实现 class Demo extends Thread { public void run() { for (int x = 0; x < 100; x++) { System.out.println("Demo:"+x); } } } public class Example01{ public static void main(String[] args) { Demo d = new Demo(); d.start(); for(int x=0; x<100; x++){ System.out.println("main:"+x); } } } 运行结果如图5-1所示。 图5-1运行结果 三、案例总结 1、通过继承Thread类,并重写Thread类中的run()方法可以实现多线程。 2、Thread类中,提供的start()方法用于启动新线程,线程启动后,系统会自动调用run()方法。 3、main()方法中有一条主线程在运行。

Java创建线程的两种方式以及区别

由于这三个线程也是彼此独立,各自拥有自己的资源,即100张电影票,因此程序输出的结果和(1)结果大同小异。均是各自线程对自己的100张票进行单独的处理,互不影响。 可见,只要现实的情况要求保证新建线程彼此相互独立,各自拥有资源,且互不干扰,采用哪个方式来创建多线程都是可以的。因为这两种方式创建的多线程程序能够实现相同的功能。 由于这三个线程也是彼此独立,各自拥有自己的资源,即100张电影票,因此程序输出的结果和例4.2.1的结果大同小异。均是各自线程对自己的100张票进行单独的处理,互不影响。 可见,只要现实的情况要求保证新建线程彼此相互独立,各自拥有资源,且互不干扰,采用哪个方式来创建多线程都是可以的。因为这两种方式创建的多线程程序能够实现相同的功能。

结果正如前面分析的那样,程序在内存中仅创建了一个资源,而新建的三个线程都是基于访问这同一资源的,并且由于每个线程上所运行的是相同的代码,因此它们执行的功能也是相同的。

可见,如果现实问题中要求必须创建多个线程来执行同一任务,而且这多个线程之间还将共享同一个资源,那么就可以使用实现Runnable接口的方式来创建多线程程序。而这一功能通过扩展Thread类是无法实现的,读者想想看,为什么? 实现Runnable接口相对于扩展Thread类来说,具有无可比拟的优势。这种方式不仅有利于程序的健壮性,使代码能够被多个线程共享,而且代码和数据资源相对独立,从而特别适合多个具有相同代码的线程去处理同一资源的情况。这样一来,线程、代码和数据资源三者有效分离,很好地体现了面向对象程序设计的思想。因此,几乎所有的多线程程序都是通过实现Runnable接口的方式来完成的。

多线程练习题

0、Java中多线程同步是什么? 在多线程程序下,同步能控制对共享资源的访问。如果没有同步,当一个Java线程在修改一个共享变量时,另外一个线程正在使用或者更新同一个变量,这样容易导致程序出现错误的结果。 1、解释实现多线程的几种方法? Java线程可以实现Runnable接口或者继承Thread类来实现,当你打算多重继承时,优先选择实现Runnable。还可以使用线程池。 2、Thread.start()与Thread.run()有什么区别? Thread.start()方法(native)启动线程,使之进入就绪状态,当cpu分配时间该线程时,由JVM调度执行run()方法。 3、为什么需要run()和start()方法,我们可以只用run()方法来完成任务吗? 我们需要run()&start()这两个方法是因为JVM创建一个单独的线程不同于普通方法的调用,所以这项工作由线程的start方法来完成,start由本地方法实现,需要显示地被调用,使用这俩个方法的另外一个好处是任何一个对象都可以作为线程运行,只要实现了Runn able接口,这就避免因继承了Thread类而造成的Java的多继承问题。 4、什么是ThreadLocal类,怎么使用它? ThreadLocal是一个线程级别的局部变量,并非“本地线程”。ThreadLocal为每个使用该变量的线程提供了一个独立的变量副本,每个线程修改副本时不影响其它线程对象的副本(译者注)。 5、Sleep()、suspend()和wait()之间有什么区别? Thread.sleep()使当前线程在指定的时间处于“非运行”(Not Runnable)状态。线程一直持有对象的监视器。比如一个线程当前在一个同步块或同步方法中,其它线程不能进入该块或方法中。如果另一线程调用了interrupt()方法,它将唤醒那个“睡眠的”线程。 注意:sleep()是一个静态方法。这意味着只对当前线程有效,一个常见的错误是调用t.sl eep(),(这里的t是一个不同于当前线程的线程)。即便是执行t.sleep(),也是当前线程进入睡眠,而不是t线程。t.suspend()是过时的方法,使用suspend()导致线程进入停滞状态,该线程会一直持有对象的监视器,suspend()容易引起死锁问题。 object.wait()使当前线程出于“不可运行”状态,和sleep()不同的是wait是object的方法而不是thread。调用object.wait()时,线程先要获取这个对象的对象锁,当前线程必须在锁对象保持同步,把当前线程添加到等待队列中,随后另一线程可以同步同一个对象锁来调用object.notify(),这样将唤醒原来等待中的线程,然后释放该锁。基本上wait() /notify()与sleep() /interrupt()类似,只是前者需要获取对象锁。 6、在静态方法上使用同步时会发生什么事? 同步静态方法时会获取该类的“Class”对象,所以当一个线程进入同步的静态方法中时,线程监视器获取类本身的对象锁,其它线程不能进入这个类的任何静态同步方法。它不像实例方法,因为多个线程可以同时访问不同实例同步实例方法。 7、当一个同步方法已经执行,线程能够调用对象上的非同步实例方法吗?

公章授权委托书

公章授权委托书 篇一:公章授权书 公章授权书 致: (公司名称),中华人民共和国合法企业,法定地址:。在贵公司通知的关于的相关工作中,我公司授权合同专用章在此次活动中代为公章使用。 我公司对合同专用章所签署的相关文件、协议同意据有签署行政公章等同的法律的效力。 在招标人或招标代理机构收到撤销本授权的通知以前,本授权书一直有效。被授权人签署的所有文件、协议不因授权的撤销而失效。 公司合同专用章: 公司公章: 日期:年月日 篇二:公章印鉴使用授权委托书 授权委托书 xxxx小额贷款股份有限公司: 在贵公司无偿保管我公司各类印鉴、各类财务票据、各类书面证件、银支付密码器、U盾等相关物件期间,我公司特授权委托:1、我公司法定代表人(身份证号); 2上各物件的各项工作(包括但不限于申请使用,启封

使用,在各类文书上签字、盖章,记录使用,重新封存等等)。 委托权限:以上任一受托人的一切意思表示和行为,均系我公司真实意思表示,我公司均予以无条件接受,且无任何异议。 委托期限:自贵公司保管之日起至我公司还清贵公司全部贷款本息及其他费用之日止。 本委托为不可撤销委托。若受托人有变动,我公司将以书面形式通知贵公司,如果我公司未及时通知贵公司,所造成的一切经济责任和法律后果由我公司承担。 特此委托 委托人(盖章): 受托人(签名): 年月日 篇三:公章授权委托书管理办法 公章授权委托管理办法 第一章总则 第一条为规范公司公章授权委托书的办理、使用等行为,保证公司的合法权益,依据国家有关法律和法规相关规 章制度,特制定本办法。 第二条本办法所指委托是公司授权委托个人在特定 时间就特定内容事项行使职权的法律文件依据,是证明

经典多线程的练习题

java中有几种方法可以实现一个线程(jdk5.0之前)?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 答:有两种实现方法,分别是继承Thread类与实现Runnable接口。 用synchronized关键字修饰同步方法,反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。 suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志, 指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。 sl eep() 和wait() 有什么区别? 答:sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 同步和异步有何异同,在什么情况下分别使用他们?举例说明。 答:如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。

办理刻章授权委托书精选范本

办理刻章授权委托书精选范本 公章是一个人或一个单位的身份信息,具有很大的作用,委托他人刻章的时候,委托书怎么写?下面小编为大家精心整理了办理刻章授权委托书,希望能给你带来帮助。 办理刻章授权委托书篇一委托书 大兴公安局: 我北京**********有限公司法人****现委托*****前往贵处办理刻章审批事宜,刻制合同专用章壹枚。特此证明。 请予办理! 被委托人:法人签字: 办理刻章授权委托书篇二委托书 上海XX区公安局: 因XXXXXX公司需要,现委XXX同志(身份证号:XXXXXX)前来贵处办理刻章(公章、法人章)相关事宜。特此委托,望予以接洽! XXXXX有限公司 法定代表人: XXX年十一月二十九日 办理刻章授权委托书篇三授权委托书 XX区公安分局: 因业务发展需要,我公司于年月日经工商部门批准,将公司名称由变更为,现申请刻制以下印章各壹枚:

1、公章; 2、合同专用章; 3、财务专用章; 4、发票专用章; 本人 (身份证号: ),系公司法定代表人,现委托公司员工 (身份证号: )前往贵局办理刻章事宜,望予以接洽。 委托人(法定代表人): 被委托人: 年月日 办理刻章授权委托书篇四致XX公安局: 本人系法定代表人,因工作繁忙不能前来办理劳动合同专用章刻章业务,特授权委托我司员工 (身份证号码: )办理相关事务,请予接洽。 委托书有效期为20xx年X月日至20xx年月日。代理人无转委权。 特此委托! 申请单位: 授权人(法定代表人)签名: 年月日 办理刻章授权委托书篇五致: (公司名称),中华人民共和国合法企业,法定地址:。在贵公

司通知的关于的相关工作中,我公司授权合同专用章在此次活动中代为公章使用。 我公司对合同专用章所签署的相关文件、协议同意据有签署行政公章等同的法律的效力。 在招标人或招标代理机构收到撤销本授权的通知以前,本授权书一直有效。被授权人签署的所有文件、协议不因授权的撤销而失效。 公司合同专用章: 公司公章: 日期:年月日 办理刻章授权委托书篇六xxxx小额贷款股份有限公司:在贵公司无偿保管我公司各类印鉴、各类财务票据、各类书面证件、网银支付密码器、U盾等相关物件期间,我公司特授权委托: 1、我公司法定代表人____(身份证号______); 2、______(身份证号______)代为办理使用以上各物件的各项工作(包括但不限于申请使用,启封使用,在各类文书上签字、盖章,记录使用,重新封存等等)。 委托权限:以上任一受托人的一切意思表示和行为,均系我公司真实意思表示,我公司均予以无条件接受,且无任何异议。 委托期限:自贵公司保管之日起至我公司还清贵公司全部贷款本息及其他费用之日止。 本委托为不可撤销委托。若受托人有变动,我公司将以书面形式通知贵公司,如果我公司未及时通知贵公司,所造成的一切经济责任

线程编程方面笔试题

线程编程方面java笔试题 60、java中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和suspend()方法为何不推荐使用? 答:有两种实现方法,分别是继承Thread类与实现Runnable接口 用synchronized关键字修饰同步方法 反对使用stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被"挂起"的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用suspend(),而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。 61、sleep() 和 wait() 有什么区别? 答:sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池准备获得对象锁进入运行状态。 62、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 答:如果数据将在线程间共享。例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。 63、启动一个线程是用run()还是start()? 答:启动一个线程是调用start()方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。run()方法可以产生必须退出的标志来停止一个线程。 64、当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法? 答:不能,一个对象的一个synchronized方法只能由一个线程访问。 65、请说出你所知道的线程同步的方法。 答:wait():使一个线程处于等待状态,并且释放所持有的对象的lock。 sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要捕捉Interrupt edException异常。 notify():唤醒一个处于等待状态的线程,注意的是在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由JVM确定唤醒哪个线程,而且不是按优先级。 Allnotity():唤醒所有处入等待状态的线程,注意并不是给所有唤醒线程一个对象的锁,而是让它们竞争。 66、多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么? 答:多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有两种,分别是synchronized,wait与notify

java创建多线程的两种方法(继承Thread类&实现Runnable接口)

java创建多线程的两种方法(继承Thread类/实现Runnable接 口) Thread 创建线程步骤: [java]view plaincopy 1.通常创建一个线程的步骤如下。 2.(1)创建一个新的线程类,继承 Thread 类并覆盖 Thread 类的 run()方法。 3.class ThreadType extends Thread{ 4.public void run(){ 5.…… 6. } 7. } 8.(2)创建一个线程类的对象,创建方法与一般对象的创建相同,使用关键字new完成。 9. ThreadType tt = new ThreadType(); 10.(3)启动新线程对象,调用 start()方法。 11. tt.start(); 12.(4)线程自己调用 run()方法。 13.void run(); 14.下面演示一个创建多个线程的例子。 15.class ThreadDemo2 extends Thread{ 16.//声明无参数,空构造方法 17. ThreadDemo2(){} 18.//声明带有字符串参数的构造方法 19. ThreadDemo2(String szName) 20. { 21.super(szName);//调用父类的构造方法 22. } 23.//重载 run 函数 24.public void run() 25. { 26.for (int count = 1,row = 1; row < 10; row++,count++) //循环计算输 出的*数目 27. { 28.for (int i = 0; i < count; i++)//循环输出指定的 count 数 目的* 29. { 30. System.out.print('*');//输出* 31. } 32. System.out.println();//输出* 33. }

实现多线程有两种方法

实现多线程有两种方法:Thread类继承和Runnable接口实现一、创建线程的第一种方式:继承Thread类。 步骤: 1,定义类继承Thread。 2,复写Thread类中的run方法。 目的:将自定义代码存储在run方法。让线程运行。//run();仅仅是对象调用方法。而线程创建了,并没有运行。 3,调用线程的start方法, 该方法两个作用:启动线程,调用run方法。 Demo d = new Demo();//创建好一个线程。 //d.start();//开启线程并执行该线程的run方法。 d.run();//仅仅是对象调用方法。而线程创建了,并没有运行。 二、创建线程的第二种方式:实现Runable接口 步骤: 1,定义类实现Runnable接口 2,覆盖Runnable接口中的run方法。 将线程要运行的代码存放在该run方法中。

3,通过Thread类建立线程对象。 4,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。 为什么要将Runnable接口的子类对象传递给Thread的构造函数。 因为,自定义的run方法所属的对象是Runnable接口的子类对象。所以要让线程去指定对象的run方法。就必须明确该run方法所属对象。 5,调用Thread类的start方法开启线程并调用Runnable接口子类的run方法。 l 实现方式和继承方式有什么区别呢? 实现方式好处:避免了单继承的局限性。 在定义线程时,建立使用实现方式。 两种方式区别: 继承Thread: 线程代码存放Thread子类run方法中。 实现Runnable,线程代码存在接口的子类的run方法。

java面试题之多线程

java面试题之多线程 线程或者说多线程,是我们处理多任务的强大工具。线程和进程是不同的,每个进程都是一个独立运行的程序,拥有自己的变量,且不同进程间的变量不能共享;而线程是运行在进程内部的,每个正在运行的进程至少有一个线程,而且不同的线程之间可以在进程范围内共享数据。也就是说进程有自己独立的存储空间,而线程是和它所属的进程内的其他线程共享一个存储空间。线程的使用可以使我们能够并行地处理一些事情。线程通过并行的处理给用户带来更好的使用体验,比如你使用的邮件系统(outlook、Thunderbird、foxmail等),你当然不希望它们在收取新邮件的时候,导致你连已经收下来的邮件都无法阅读,而只能等待收取邮件操作执行完毕。这正是线程的意义所在。 实现线程的方式 实现线程的方式有两种: 1. 继承https://www.360docs.net/doc/4012441236.html,ng.Thread,并重写它的run()方法,将线程的 执行主体放入其中。 2. 实现https://www.360docs.net/doc/4012441236.html,ng.Runnable接口,实现它的run()方法,并将 线程的执行主体放入其中。 这是继承Thread类实现线程的示例: public class ThreadTest extends Thread { public void run() { // 在这里编写线程执行的主体 // do something } } 这是实现Runnable接口实现多线程的示例: public class RunnableTest implements Runnable {

public void run() { // 在这里编写线程执行的主体 // do something } } 这两种实现方式的区别并不大。继承Thread类的方式实现起来较为简单,但是继承它的类就不能再继承别的类了,因此也就不能继承别的类的有用的方法了。而使用是想Runnable接口的方式就不存在这个问题了,而且这种实现方式将线程主体和线程对象本身分离开来,逻辑上也较为清晰,所以推荐大家更多地采用这种方式。 如何启动线程 我们通过以上两种方式实现了一个线程之后,线程的实例并没有被创建,因此它们也并没有被运行。我们要启动一个线程,必须调用方法来启动它,这个方法就是Thread类的start()方法,而不是run()方法(既不是我们继承Thread类重写的run()方法,也不是实现Runnable接口的run()方法)。run()方法中包含的是线程的主体,也就是这个线程被启动后将要运行的代码,它跟线程的启动没有任何关系。上面两种实现线程的方式在启动时会有所不同。 继承Thread类的启动方式: public class ThreadStartTest { public static void main(String[] args) { // 创建一个线程实例 ThreadTest tt = new ThreadTest(); // 启动线程 tt.start(); } } 实现Runnable接口的启动方式:

VB多线程的几种实现方法

VB多线程的几种实现方法2009-11-23 04:18先说多线程: 方法1 :CreateThread 不用多说,万变不离其宗,这是Win32 内创建线程的唯一系统方法,以下介绍的多线程创建方式虽然不直接接触这个Win32 APi,但系统也是通过他创建的。 方法2 :TimerSetEvent 这个函数是Win32 系统的一个高精度计时器函数,通过调用这个函数,系统会创建一个新的线程,让Timer回调函数中的代码运行在这个新线程中。 方法3 :SHCreateThread 很多人应该没见过这个函数,这是shlwapi.dll 的一个导出函数,这个函数看字面也能理解是个创建多线程的函数,而且。。。他是基于对象操作的多线程函数,也就是说他能够稳定的运行一些用上面2种方法创建,但不能稳定运行的代码。至少这个函数在IDE 的环境下表现的中规中矩!使用方法可查API-GUIDE 方法4 :想起来了, CreateRemoteThread 创建远程线程,经测试一点也不稳定,根本没法说下去了,还不如直接调用CreateThread 但,做为一种线程的创建方法,还是希望能够熟悉一下,如果不用VB写代码,要写跨进程线程,这是一个简单易行的办法,否则只能继续SetWindowHook了,熟悉汇编指令的还可以远程分配内存写硬编码执行 方法5 :简单说下ActiveX 方式的多线程 论坛里面有用这种方法实现的稳定多线程,代码虽好,但我却不会用,在倡导绿色软件的今天,为了一个多线程,而注册表里面又要多点xx,不好。。而且卸载麻烦。用ActiveX 创建线程与其他方式创建的线程最重要的地方要主义,任何VB函数的调用最好都建立在新线程中新初始化的对象基础上执行,不要跨对象调用,而ActiveX 的安全线程本身也正是利用了这点,不知道研究ActiveX 的老大们有没注意,利用他特性实现的多线程,是初始化的一个新的线程,而这个线程中初始化的对象则是整个工程。很大的资源浪费,而且有时候还不好控制,不是你想要的效果。总之一句话,新线程中要自己初始化新的对象而且最好不要用实例继承 方法6 :我的想法 记得以前CSDN 中有人做过一个代码,通过函数地址抓取函数内的机器码,如果能够知道VB何时已将代码进行了机器码的转换,然后抓取这些代码放到数组中执行,那应该是非常稳定的。这纯属娱乐的想法,虽然能够实现,但有点过分了,除非是VB 多线程的狂热者,

多线程面试题

多线程面试题 第一题:线程的基本概念、线程的基本状态及状态之间的关系? 线程,有时称为轻量级进程,是CPU使用的基本单元;它由线程ID、程序计数器、寄存器集合和堆栈组成。它与属于同一进程的其他线程共享其代码段、数据段和其他操作系统资源(如打开文件和信号)。 线程有四种状态:新生状态、可运行状态、被阻塞状态、死亡状态。状态之间的转换如下图所示: 第二题:线程与进程的区别? 1、线程是进程的一部分,所以线程有的时候被称为是轻权进程或者轻量级进程。 2、一个没有线程的进程是可以被看作单线程的,如果一个进程内拥有多个进程,进程的执行过程不是一条线(线程)的,而是多条线(线程)

共同完成的。 3、系统在运行的时候会为每个进程分配不同的内存区域,但是不会为线程分配内存(线程所使用的资源是它所属的进程的资源),线程组只能共享资源。那就是说,出了CPU之外(线程在运行的时候要占用CPU 资源),计算机内部的软硬件资源的分配与线程无关,线程只能共享它所属进程的资源。 4、与进程的控制表PCB相似,线程也有自己的控制表TCB,但是TCB 中所保存的线程状态比PCB表中少多了。 5、进程是系统所有资源分配时候的一个基本单位,拥有一个完整的虚拟空间地址,并不依赖线程而独立存在。 第三题:多线程有几种实现方法,都是什么? 1. 继承Thread 类 2. 实现Runnable 接口再new Thread(YourRunnableOjbect)

第四题:多线程同步和互斥有几种实现方法,都是什么? 线程间的同步方法大体可分为两类:用户模式和内核模式。顾名思义,内核模式就是指利用系统内核对象的单一性来进行同步,使用时需要切换内核态与用户态,而用户模式就是不需要切换到内核态,只在用户态完成操作。 用户模式下的方法有:原子操作(例如一个单一的全局变量),临界区。内核模式下的方法有:事件,信号量,互斥量。 第五题:多线程同步和互斥有何异同,在什么情况下分别使用他们?举例说明。 线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒。 线程互斥是指对于共享的进程系统资源,在各单个线程访问时的排它性。当有若干个线程都要使用某一共享资源时,任何时刻最多只允许一个线程去使用,其它要使用该资源的线程必须等待,直到占用资源者释放该资源。线程互斥可以看成是一种特殊的线程同步(下文统称为同步)。

多线程同步方法及比较

多线程同步方法及比较 多线程同步方法: 1.临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数 据访问。. 2.互斥量:为协调一起对一个共享资源的单独访问而设计的。. 3.信号量:为控制一个具备有限数量用户资源而设计。. 4.事件:用来通知线程有一些事件已发生,从而启动后继任务的开始。 临界区(Critical Section).. 确保在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。假如有多个线程试图同时访问临界区,那么在有一个线程进入后其他任何试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程能够继续抢占,并以此达到用原子方式操作共享资源的目的。 临界区包含两个操作原语: EnterCriticalSection()进入临界区 LeaveCriticalSection()离开临界区。 EnterCriticalSection()语句执行后代码将进入临界区以后无论发生什么,必须确保和之匹配的LeaveCriticalSection()都能够被执行到。否则临界区保护的共享资源将永远不会被释放。虽然临界区同步速度很快,但却只能用来同步本进程内的线程,而不可用来同步多个进程中的线程。 MFC为临界区提供有一个CCriticalSection类,使用该类进行线程同步处理是很简单的。只需在线程函数中用CCriticalSection类成员函数Lock()和UnLock()标定出被保护代码片段即可。Lock()后代码用到的资源自动被视为临界区内的资源被保护。UnLock后别的线程才能访问这些资源。. ------------------------------------------------

关于线程同步(5种同步方式)

Java笔记--关于线程同步(5种同步方式) 为何要使用同步? java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查), 将会导致数据不准确,相互之间产生冲突,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用, 从而保证了该变量的唯一性和准确性。 1.同步方法 即有synchronized关键字修饰的方法。 由于java的每个对象都有一个内置锁,当用此关键字修饰方法时, 内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。 代码如: public synchronized void save(){} 注: synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类 2.同步代码块 即有synchronized关键字修饰的语句块。 被该关键字修饰的语句块会自动被加上内置锁,从而实现同步 代码如: synchronized(object){ } 注:同步是一种高开销的操作,因此应该尽量减少同步的内容。 通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。 代码实例:

package com.xhj.thread; /** * 线程同步的运用 * * @author XIEHEJUN * */ public class SynchronizedThread { class Bank { private int account = 100; public int getAccount() { return account; } /** * 用同步方法实现 * * @param money */ public synchronized void save(int money) { account += money; } /** * 用同步代码块实现 * * @param money */ public void save1(int money) {

多线程同步的三种方式 Linux

多线程同步的三种?方式: Linux 线程同步有最常?用的是:互斥锁、条件变量量和信号量量。?一、通过锁机制实现线程间的同步。初始化锁。在Linux下,线程的互斥量量数据类型是pthread_mutex_t。在使?用前,要对它进?行行初始化。静态分配:pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 动态分配:int pthread_mutex_init(pthread_mutex_t mutex, const pthreadmutexattr_t mutexattr); 加锁。对共享资源的访问,要对互斥量量进?行行加锁,如果互斥量量已经上了了锁,调?用线程会阻塞,直到互斥量量被解锁。 int pthread_mutex_lock(pthread_mutex mutex); int pthread_mutex_trylock(pthread_mutex_t mutex);解锁。在完成了了对共享资源的访问后,要对互斥量量进?行行解锁。 int pthread_mutex_unlock(pthread_mutex_t mutex);销毁锁。锁在是使?用完成后,需要进?行行销毁以释放资源。 int pthread_mutex_destroy(pthread_mutex mutex); ?二、条件变量量(cond) 与互斥锁不不同,条件变量量是?用来等待?而不不是?用来上锁的。条件变量量?用来?自动阻塞?一个线程,直到某特殊情况发?生为?止。通常条件变量量和互斥锁同时使?用。条件变量量分为两部分: 条件和变量量。条件本身是由互斥量量保护的。线程在改变条件状态前先要锁住互斥量量。条件变量量使我们可以睡眠等待某种条件出现。条件变量量是利利?用线程间共享的全局变量量进?行行同步的?一种机制,主要包括两个动作:?一个线程等待"条件变量量的条件成?立"?而挂起;另?一个线程使"条件成?立"(给出条件成?立信号)。条件的检测是在互斥锁的保护下进?行行的。如果?一个条件为假,?一个线程?自动阻塞,并释放等待状态改变的互斥锁。如果另?一个线程改变了了条件,它发信号给关联的条件变量量,唤醒?一个或多个等待它的线程,重新获得互斥锁,重新评价条件。如果两进程共享可读写的内存,条件变量量可以被?用来实现这两进程间的线程同步。初始化条件变量量。静态态初始化,pthread_cond_t cond = PTHREAD_COND_INITIALIER; 动态初始化,int pthread_cond_init(pthread_cond_t cond, pthreadcondattrt cond_attr); 等待条件成?立。释放锁,同时阻塞等待条件变量量为真才?行行。timewait()设置等待时间,仍未signal,返回ETIMEOUT(加锁保证只有?一个线程wait) int pthread_cond_wait(pthread_cond_t cond, pthreadmutext mutex); int pthread_cond_timewait(pthread_cond_t cond,pthread_mutex mutex,const timespec abstime);激活条件变量量。 pthread_cond_signal,pthread_cond_broadcast(激活所有等待线程) int pthread_cond_signal(pthread_cond_t cond); int

java多线程习题

一、选择题 1.下列说法中,正确的一项是(A )。 A.单处理机的计算机上,2个线程实际上不能并发执行 B.单处理机的计算机上,2个线程实际上能够并发执行 C.一个线程可以包含多个进程 D.一个进程只能包含一个线程 2.下列说法中,错误的一项是( A )。 A.线程就是程序B.线程是一个程序的单个执行流 C.多线程是指一个程序的多个执行流D.多线程用于实现并发 3.下列关于Thread类的线程控制方法的说法中错误的一项是()。 A.线程可以通过调用sleep()方法使比当前线程优先级低的线程运行 B.线程可以通过调用yield()方法使和当前线程优先级一样的线程运行 C.线程的sleep()方法调用结束后,该线程进入运行状态 D.若没有相同优先级的线程处于可运行状态,线程调用yield()方法时,当前线程将继续执行 5.下面的哪一个关键字通常用来对对象加锁,从而使得对对象的访问是排他的( C )? A.serialize B.transient C.synchronized D.static 6.下列说法中,错误的一项是(A )。 A.线程一旦创建,则立即自动执行 B.线程创建后需要调用start()方法,将线程置于可运行状态 C.调用线程的start()方法后,线程也不一定立即执行 D.线程处于可运行状态,意味着它可以被调度 7.下列说法中,错误的一项是()。 A.Thread类中没有定义run()方法B.可以通过继承Thread类来创建线程 C.Runnable接口中定义了run()方法D.可以通过实现Runnable接口创建线程【解析】Thread类和Runnable接口中都定义了run()方法,而start()方法只有Thread类中进行了定义,而Runnable接口中没有定义。 8.Thread类定义在下列哪个包中()? A.java.io B.https://www.360docs.net/doc/4012441236.html,ng C.java.util D.java.awt 9.Thread类的常量NORM_PRIORITY代表的优先级是()。 A.最低优先级B.最高优先级C.普通优先级D.不是优先级10.下列关于线程优先级的说法中,错误的一项是()。 A.MIN_PRIORITY代表最低优先级B.MAX_PRIORITY代表最高优先级C.NORM_PRIORITY代表普通优先级D.代表优先级的常数值越大优先级越低二、填空题 1.多线程是指程序中同时存在着个执行体,它们按几条不同的执行路线共同工作,独立完成各自的功能而互不干扰。 2.每个Java程序都有一个缺省的主线程,对于Application类型的程序来说,主线程是方法执行的线程。 3.Java语言使用类及其子类的对象来表示线程,新建的线程在它的一个完整的生命周期中通常要经历、、、和等五种状态。

java多线程试题

狂翔IT工作室多线程试程 一.选择题 1.下列说法中,正确的一项是() A A.单处理机的计算机上,2个纯种一官半职直不能并发执行 B.单处理机的计算机上,2个线程实际能够并发执行 C.一个线程可以包含多个线程 D.一个进程只能包含一个线程 2.下列说法中错误的一项是()A A.线程就是程序 B.线程是一个程序的单个执行流 B.多线程是指一个程序的多个执行流D.多线程用于实现并发 3.下列哪个一个操作不能使线程从等待阻塞状态进入对象阻塞状态(D) A.等待阴塞状态下的线程被notify()唤 B.等待阻塞状态下的纯种被interrput()中断 C.等待时间到 D.等待阻塞状态下的线程调用wait()方法 4.下列哪个方法可以使线程从运行状态进入其他阻塞状态(A) A.sleep B.wait C.yield D.start 5.下列不是进程组成部分的一项是(D) A.代码 B.数据 C.内核状态 D.显示器 6.下列哪一个不属于java线程模型的组成部分(D) A.虚拟的CPU B.虚拟CPU执行的代码 C. 代码所操作的数据 D.执行流 7.下列说法中错误的一项是(C) A.Java中的第一个线程都属于某个线程组 B.线程只能在其创建时设置所属的线程组 C.线程创建之后,可以从一个线程组转移到另一个线程组 D.新建的线程默认情况下属于其父线程所属的线程组 8.下列不属于线程组成部分的一项是(C) A.程序计数器 B.堆栈 C. 进程地十空间中的代码 D.栈指针 9.下列关于JA V A线程模型的说法中,错误的一项是(A) A.Java线程模型包括计算机的CPU B.代码可以与其他线程共享 C. 数据可以被多个线程共享 D.线程模型在https://www.360docs.net/doc/4012441236.html,ng.Thread类中被定义 10.下列说法中错误的一项是(D) A.一个线程是一个Thread类的实例 B.线程从传递给纯种的Runnable实例run()方法开始执行 C.线程操作的数据来自Runnable实例 D.新建的线程调用start()方法就能立即进入运行状态 11.下列关于Thread类提供的线程控制方法的说法中,错误的一项是(D) A.在线程A中执行线程B的join()方法,则线程A等待直到B执行完成 B.线程A通过调用interrupt()方法来中断其阻塞状态 C.若线程A调用方法isAlive()返回值为true,则说明A正在执行中 D.currentThread()方法返回当前线程的引用

相关文档
最新文档