快速业务通道

java中的线程 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-25
t2:2 t2:3 t2:4 t2:5 t2:6 t2:7 t2:8 t2:9

多次运行这个程序,输出也是一样。这说明:yield()方法不会使不同优先级的线程有执行的机会。

java中的线程(7)

时间:2007-11-05

六:wait(),notify(),notifyAll()

首先说明:wait(),notify(),notifyAll()这些方法由java.lang.Object类提供,而上面讲到的方法都是由java.lang.Thread类提供(Thread类实现了Runnable接口)。

wait(),notify(),notifyAll()这三个方法用于协调多个线程对共享数据的存取,所以必须在synchronized语句块内使用这三个方法。先看下面了例子:

示例12:

public class ThreadTest implements Runnable {public static int shareVar = 0;public synchronized void run() {if (shareVar == 0) {for (int i = 0; i < 10; i++) {shareVar++;if (shareVar == 5) {try {this.wait();}catch (Exception e) {}}}}if (shareVar != 0) {System.out.print(Thread.currentThread().getName());System.out.println(" shareVar = " + shareVar);this.notify();}}public static void main(String[] args) {Runnable r = new ThreadTest();Thread t1 = new Thread(r, "t1");10Thread t2 = new Thread(r, "t2");t1.start();t2.start();}}

运行结果:

t2 shareVar=5

t1 shareVar=10

t1线程最先执行。由于初始状态下shareVar为0,t1将使shareVar连续加1,当shareVar的值为5时,t1调用wait()方法,t1将处于休息状态,同时释放锁标志。这时t2得到了锁标志开始执行,shareVar的值已经变为5,所以t2直接输出shareVar的值,然后再调用notify()方法唤醒t1。t1接着上次休息前的进度继续执行,把shareVar的值一直加到10,由于此刻shareVar的值不为0,所以t1将输出此刻shareVar的值,然后再调用notify()方法,由于此刻已经没有等待锁标志的线程,所以此调用语句不起任何作用。

这个程序简单的示范了wait(),notify()的用法,读者还需要在实践中继续摸索。

java中的线程(8)

时间:2007-11-05

七:关于线程的补充

编写一个具有多线程能力的程序可以继承Thread类,也可以实现Runnable接口。在这两个方法中如何选择呢?从面向对象的角度考虑,作者建议你实现Runnable接口。有时你也必须实现Runnable接口,例如当你编写具有多线程能力的小应用程序的时候。

线程的调度:

NewRunningRunnableOtherwise BlockedDeadBlocked in object`sit()

poolBlocked in object`slock poolnotify() Schedulercompletesrun() start()

sleep() or join() sleep() timeout or thread join() s or interupt()

Lockavailablesynchronized() Thread states

terupt()一个Thread对象在它的生命周期中会处于各种不同的状态,上图形象地说明了这点。wain

调用start()方法使线程处于可运行状态,这意味着它可以由JVM调度并执行。这并不意味着线程就会立即运行。

实际上,程序中的多个线程并不是同时执行的。除非线程正在真正的多CPU计算机系统上执行,否则线程使用单CPU必须轮流执行。但是,由于这发生的很快,我们常常认为这些线程是同时执行的。

java中的线程(9)

时间:2007-11-05

JAVA运行时系统的计划调度程序是抢占性的。如果计划调度程序正在运行一个线程并且来了另一个优先级更高的线程,那么当前正在执行的线程就被暂时终止而让更高优先级的线程执行。

JAVA计划调度程序不会为与当前线程具有同样优先级的另一个线程去抢占当前的线程。但是,尽管计划调度程序本身没有时间片(即它没有给相同优先级的线程以执行用的时间片),但以Thread类为基础的线程的系统实现可能会支持时间片分配。这依赖具体的操作系统,Windows与UNIX在这个问

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号