Java线程控制权源代码的深入探讨

发表于:2010-4-28 10:29

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

#
java
#
Java

  Java线程控制权的问题十分重要,我们在不断的学习中需要不断的注意相关的问题。下面我们就来看看在源代码中Java 线程控制权式如何体现的。当wait的时候其实就是已经放出了线程的控制权,所以one可以运行。one运行时调用notify后又唤醒了two线程所以打印顺序才是:

  wait
  sleep
  wake up

  我觉得我解释的已经很清楚了。wait被调用的时候放弃锁,而控制线程是否能使用内容的关键就在于锁,wait并不是thread的内容,而来自于object。你可以这样来理解wait,我wait下就把接力棒交出去了,我当前的这个线程就暂停运行,记住是当前的线程。然后当我交出的接力棒已经又回到我手中的时候,也就是说其他的线程已经完成了任务。这个时候我拿到接力棒继续奔跑。

  有时候你应该把问题简单化,建议你看看thinking in java第四版,我明白你是想观察阻塞的出现,你可以将one.start放到two.start的上边就会明白什么意思了

package test;
import java.util.LinkedList;
public class Test_2_A2 {
  public static void main(String[] args) {
    SubTreadOne one = new SubTreadOne();
    SubTreadTwo two = new SubTreadTwo(one);
    two.start();
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    one.start();
  }
}

class SubTreadOne extends Thread {
  public SubTreadOne() {
  }
  public void run() {
    try {
    System.out.println("sleep");
    Thread.sleep(3000);
      synchronized (this) {
      this.notifyAll();
      }
    }catch (InterruptedException e) {
    e.printStackTrace();
    }
  }
}

class SubTreadTwo extends Thread {
SubTreadOne one;
  public SubTreadTwo(SubTreadOne one) {
    this.one = one;
  }
  public SubTreadTwo() {
  }
  public void run() {
    try {
      synchronized (one) {
        System.out.println("wait");
        one.wait();
        System.out.println("wake up");
      }
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
  }
}

  以上就是对Java线程控制权有关代码的详细介绍。

《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号