线程基础(第二部分)Java线程的缺陷和副作用几解决办法

豆豆网   技术应用频道   2006年03月31日  【字号: 收藏本文

本文详细介绍线程基础(第二部分)Java线程的缺陷和副作用几解决办法

  Join

  如果一个应用程序需要执行很多时间,比如一个耗时很长的计算工作,你可以把该计算工作设计成线程。但是,假定还有另外一个线程需要计算结果,当计算结果出来后,如何让那个线程知道计算结果呢?解决该问题的一个方法是让第二个线程一直不停地检查一些变量的状态,直到这些变量的状态发生改变。这样的方式在UNIX风格的服务器中常常用到。Java提供了一个更加简单的机制,即线程类中的join 方法。

  join 方法使得一个线程等待另外一个线程的结束。例如,一个GUI (或者其他线程)使用join方法等待一个子线程执行完毕:

  CompleteCalcThread t = new

  CompleteCalcThread();

  t.start();

  //

  // 做一会儿其他的事情

  // 然后等待

  t.join();

  // 使用计算结果...

  你可以看到,用对子线程使用join方法,等待子线程执行完毕。 Join 有三种格式:

  void join(): 等待线程执行完毕。

  void join(long timeout): 最多等待某段时间让线程完成。

  void join(long milliseconds, int nanoseconds): 最多等待某段时间(毫秒+纳秒),让线程完成。

  线程API isAlive同join相关联时,是很有用的。一个线程在start(此时run方法已经启动)之后,在stop之前的某时刻处于isAlive 状态。

  对于编写线程的程序员来说,还有其他两个有用的线程API,即wait和 notify。使用这两个API,我们可以精确地控制线程的执行过程。考虑一个简单的例子,有个生产者线程和消费者线程,为了让应用程序更有效率,所以我们不打算采用查询等待的方法。当消费者可以消费对象时,消费者需要得知该信息。

  我们可以把该例子阐述如下:生产者线程不断地在运行着,把项目放入列表中,该列表的add方法由synchronize 关键字保护着,当一个对象添加到列表中,生产者就可以通知消费者:它已经添加一个对象,消费者可以消费该对象了。每个对象的run方法的伪代码请见表A。

责编:豆豆技术应用

正在加载评论...