Java 线程让步

概要:

线程让步(yield)让当前运行的线程放弃其所占用的CPU时间片,以便让其他线程运行,用线程让步的目的是让线程能适当地轮转,但并不能保证达到此效果。因为即使当前线程放弃时间片,还有可能再次被Java虚拟机(JVM)选中。

| |目录

技术要点

    运用线程让步的技术要点如下:

  • 执行一次让步操作只让步一个时间片,当下次时间片轮到该线程时,该线程会继续运行。由于一个时间片非常短,最多几个毫秒,因此一次线程让步操作的效果微乎其微,甚至觉察不出。

  • 线程让步适用于同级别的线程让步,且让步后不是转入阻塞状态,则是就绪状态,不抛出异常。

代码实现

package net.xsoftlab.baike;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Vector;
public class TextThreadYield {// 操作线程让步的类
	private Vector vector = new Vector();// 创建向量集合
	private DateFormat dateFormat = new SimpleDateFormat("HH-mm-ss:SSSS");// 创建日期格式
	private boolean isFlag = false;
	private class Yield extends Thread {// 让步接收文件类
		public Yield() {
			this.setName("接收文件");// 设置线程名称
			this.setDaemon(true);// 如果SendFile线程结束,则该线程自动结束
		}
		public void run() {
			while (!isFlag) {// 标识为真进行循环
				try {
					Thread.sleep(100);// 休眠
				} catch (InterruptedException e) {// 捕获唤醒异常
					System.out.println("唤醒异常:" + e.getMessage());
				}
				if (vector.size() == 0) {// 判断向量集合大小
					System.out.println(dateFormat.format(new Date())
							+ "	向量集合中没有文件,执行yield操作");
					Thread.yield();// 调用线程让步
				} else {
					String ss = (String) vector.remove(0);// 移队文件获得对象
					System.out.println(dateFormat.format(new Date())
							+ "	取到文件,名为" + ss);
				}
			}
		}
	}
	private class SendFile extends Thread {// 发送文件类
		private String[] files = new String[] { "新闻文件", "国内旅游向导", "山水名画欣赏",
				"发家致富说明" };
		public SendFile() {
			this.setName("发送文件");
		}
		public void run() {
			try {
				for (int i = 0; i < files.length; i++) {// 循环使线程休眠
					Thread.sleep(201);// 线程休眠
					vector.add(files[i]);// 添加文件
				}
				Thread.sleep(100);// 线程休眠
			} catch (InterruptedException e) {// 捕获唤醒异常
				System.out.println("唤醒异常:" + e.getMessage());
			}
		}
	}
	public static void main(String[] args) {// java程序主入口处
		TextThreadYield text = new TextThreadYield();// 实例化对象
		text.new Yield().start();// 实例对象启动线程
		text.new SendFile().start();
	}
}

程序解读

  1. TextThreadYield类创建向量集合操作传送的文件,创建日期格式类对获得的时间格式化,声明一标识变量控制循环。其Yield内部类的构造方法设置线程的名称并设置其线程为守护线程。功能是如果SendFile类线程结束,则其线程也自动结束。类的run()方法判断向量集合中是否有元素,如果有则获取移除的对象并显示,否则调用线程的yield()让步方法,进行该线程的让步。

  2. SendFile类继承Thread类,在其构造方法中设置该线程的名称。run()方法利用循环使线程休眠并向向量集合中添加文件元素。设置线程的休眠时间以使Yield类线程进行时间让步。

  3. 一般而言,线程的yield操作效果是非常小的,读者可以将Thread.yield();一行去掉或注释掉,看一下不用yield与用yield有什么区别。


评论关闭
评论 还能输入200
评论关闭
评论 还能输入200
  • 全部评论(0)
资料加载中...
已关注 , 取消