java

位置:IT落伍者 >> java >> 浏览文章

Java2入门经典教程 11.2 管理线程[9]


发布日期:2018年05月19日
 
Java2入门经典教程 11.2 管理线程[9]

调用sleep()和调用wait(}的主要不同之处是wait()释放当前线程对其加锁的任何对象但是seep()不行wait()按这种方式作很重要否则另一个线程没办法改变以使当前线程要求的条件能被满足

因此wait()有代表性的使用是

sychronized(anibject)

{

while(conditionnotmet)

anobjectwait();

//condition is met so continnue……

}

这里当wail()方法被调用时这个线程将挂起操作直到针对同一对象的某个其他同步经调用notifyf()(或更有代表性的notifyAll())后者允许while环继续并再次检查条件当然这仍可以不被满足在这种情况下wait()方法将再次被调用因此另一个线程可以对anObject操作从这点上你可以看到wait()不只是为了得到一个对象的访问直到满足某些条件时才允许其他线程访问你甚至可以安排一个线程不能继续工作直到给定数量的其他线程对这个对象调用了notify()来确保实现最小数量的操作

当你有多于两个的线程对一个对象同步时最好用nntifyAll()而不用notify()当两个或多个线程通过调用wait()挂起时如果你调用notify()只有其中一个线程被启动但不能直接控制它这可能造成被启动的线程再次调用wait()因为它要求的条件没被满足这些将让所有的线程互相等待不可能继续执行

虽然这些方法每个功能都非常简单但应用它们会变得非常复杂通过使用synchronized方法和代码块的对象很有可能多个线程相互影响我们通过看看如何使用wait()和notifyAll()去掉最后一个例子中的儿个while循环探讨一些基本内容

在银行程序中使用Wait()和notifyAll()

在生成交易并将它们传递给Clerk对象的main()方法的for循环中我们有两个对Clerk对象调用isBusy()方法的while循环当职员仍然忙时我们不能向职员传递交易通过改变Clerk类为了使Clerk类可以使用wait()和notifyAll()我们去掉这个需求

Java入门经典在线教程完整版

[] [] [] [] [] [] [] [] []

               

上一篇:Java2入门经典教程 11.2 管理线程[1]

下一篇:Java2入门经典教程 11.2 管理线程[8]