二级java面向对象编程辅导:线程放弃运行态(10)
来源:优易学  2011-10-20 9:35:41   【优易学:中国教育考试门户网】   资料下载   IT书店

  1.调节各个线程的优先级
  Thread类中的setPriority(int)和getPriority()方法可以设置和获取线程的优先级。优先级用整数表示。取值范围为1-10.Thread有三个静态变量:
  MAX_PRIORITY :取值为10,最高。
  MIN_PRIORITY:取值为1,最低。
  NORM_PRIORITY:取值为5,默认。
  主线程默认的优先级为5,若A线程创建了B线程,则B和A有同样的优先级。值得注意的是,在实际的OS中,JVM的优先级没有得到很好的映射,若对程序的可移植性有高的要求的话,那么应该确保在设置线程优先级时只使用上述三个静态变量。
  2.线程睡眠:
  使用sleep()方法,线程会转为阻塞态。休眠结束后转为就绪态。若中途打断(用interrupt()方法),则抛出异常InterruptedException。
  3.线程让步:
  使用yield()方法,若此时有相同优先级(或更高)的其他线程处于就绪态,则将当前运行的线程放到可运行池中(就绪态)并使其他线程运行。若没有相同优先级的线程则什么都不做。和sleep不同的地方是,sleep方法不考虑进程的优先级,而且sleep在休眠的时候转入阻塞态,具有更好的移植性。yield实际的作用是在测试中人为的提高程序的并发性能,以帮助发现一些隐藏的错误。
  4.等待其他线程结束:
  一个线程可以使用另一个线程的join()方法,当前运行的线程会转到阻塞态,直到另一个线程运行结束,它才会恢复运行。join可以传入超时的时间参数,若超过这个时间则线程也会恢复运行。
  package org.bupt.test;
  public class Machine extends Thread{
  public void run() {
  for (int a = 0; a < 50; a++) {
  System.out.println(currentThread().getName()+":"+a);
  }
  }
  public static void main(String[] args) throws InterruptedException {
  Machine machine=new Machine();
  machine.setName("m1");
  machine.start();
  System.out.println("main:join machine");
  machine.join();
  System.out.println("main:end");
  }
  }

  运行结果:
  main:join machine
  m1:0
  m1:1
  m1:2
  m1:3
  m1:4
  m1:5
  m1:6
  m1:7
  m1:8
  m1:9
  m1:10
  m1:11
  m1:12
  m1:13
  m1:14
  m1:15
  m1:16
  m1:17
  m1:18
  m1:19
  m1:20
  m1:21
  m1:22
  m1:23
  m1:24
  m1:25
  m1:26
  m1:27
  m1:28
  m1:29
  m1:30
  m1:31
  m1:32
  m1:33
  m1:34
  m1:35
  m1:36
  m1:37
  m1:38
  m1:39
  m1:40
  m1:41
  m1:42
  m1:43
  m1:44
  m1:45
  m1:46
  m1:47
  m1:48
  m1:49
  main:end

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训