Java线程基础(15): yield()、Sleep()

目录

1、yield和sleep方法

3、yield和sleep释放锁的意义?


1、yield和sleep方法

  • Thread.sleep(long millis),一定是当前线程调用此方法,当前线程进入TIMED_WAITING状态,但不释放对象锁,millis后线程自动苏醒进入就绪状态。作用:给其它线程执行机会的最佳方式。
  • Thread.yield(),一定是当前线程调用此方法,当前线程放弃获取的CPU时间片,但不释放锁资源,由运行状态变为就绪状态,让OS再次选择线程。作用:让相同优先级的线程轮流执行,但并不保证一定会轮流执行。实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。Thread.yield()不会导致阻塞。该方法与sleep()类似,只是不能由用户指定暂停多长时间。

2、案例分析

package threadtest.waitNotifyJoin;
 
/**
 * yield 和 sleep test,通过Runnable接口实现多线程
 * 
 * @author Administrator
 */
public class ThreadYieldAndSleepTest implements Runnable {
	private int count = 0;// 系统访问次数
 
	@Override
	public synchronized void run() {// 通过synchronized实现同步
		count++;
		try {
			if (count == 1) {
				/// <注>. sleep 和 yield 都不会释放 <锁资源>。
				// Thread.sleep(5000);
				 Thread.yield();
				
				// this.wait();
			}
		}  catch (Exception e) {
			// TODO: handle exception
		}
 
		System.out.println(Thread.currentThread().getName() + "线程: " + "第" + count + "位访客来啦!");
	}
 
	public static void main(String[] args) {
		ThreadYieldAndSleepTest rd = new ThreadYieldAndSleepTest();
		for (int i = 1; i <= 50; i++) {
			Thread thread = new Thread(rd, String.valueOf(i));
			thread.start(); // 一定要注意不是通过.run()启动线程
		}
	}
}

执行多遍,结果可发现,是按照顺行执行的。

/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/bin/java "-javaagent:/Applications/IntelliJ IDEA 2.app/Contents/lib/idea_rt.jar=61853:/Applications/IntelliJ IDEA 2.app/Contents/bin" -Dfile.encoding=UTF-8 -classpath /Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/deploy.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/ext/cldrdata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/ext/dnsns.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/ext/jaccess.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/ext/jfxrt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/ext/localedata.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/ext/nashorn.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/ext/sunec.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/ext/sunjce_provider.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/ext/sunpkcs11.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/ext/zipfs.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/javaws.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/jfxswt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/management-agent.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/plugin.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/resources.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/jre/lib/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/lib/ant-javafx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/lib/dt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/lib/javafx-mx.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/lib/jconsole.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/lib/packager.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/lib/sa-jdi.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_301.jdk/Contents/Home/lib/tools.jar:/Users/lihe/IdeaProjects/DemoHSP/target/classes:/Users/lihe/.m2/repository/mysql/mysql-connector-java/8.0.25/mysql-connector-java-8.0.25.jar:/Users/lihe/.m2/repository/com/google/protobuf/protobuf-java/3.11.4/protobuf-java-3.11.4.jar:/Users/lihe/.m2/repository/com/google/guava/guava/18.0/guava-18.0.jar:/Users/lihe/.m2/repository/org/apache/commons/commons-collections4/4.3/commons-collections4-4.3.jar:/Users/lihe/.m2/repository/org/apache/commons/commons-lang3/3.11/commons-lang3-3.11.jar com.sankuai.payrc.ThreadYieldAndSleepTest
1线程: 第1位访客来啦!
4线程: 第2位访客来啦!
3线程: 第3位访客来啦!
2线程: 第4位访客来啦!
28线程: 第5位访客来啦!
27线程: 第6位访客来啦!
26线程: 第7位访客来啦!
25线程: 第8位访客来啦!
24线程: 第9位访客来啦!
23线程: 第10位访客来啦!
22线程: 第11位访客来啦!
21线程: 第12位访客来啦!
20线程: 第13位访客来啦!
19线程: 第14位访客来啦!
18线程: 第15位访客来啦!
35线程: 第16位访客来啦!
17线程: 第17位访客来啦!
16线程: 第18位访客来啦!
15线程: 第19位访客来啦!
13线程: 第20位访客来啦!
14线程: 第21位访客来啦!
12线程: 第22位访客来啦!
11线程: 第23位访客来啦!
5线程: 第24位访客来啦!
39线程: 第25位访客来啦!
42线程: 第26位访客来啦!
6线程: 第27位访客来啦!
43线程: 第28位访客来啦!
10线程: 第29位访客来啦!
9线程: 第30位访客来啦!
8线程: 第31位访客来啦!
45线程: 第32位访客来啦!
7线程: 第33位访客来啦!
46线程: 第34位访客来啦!
44线程: 第35位访客来啦!
41线程: 第36位访客来啦!
40线程: 第37位访客来啦!
38线程: 第38位访客来啦!
37线程: 第39位访客来啦!
36线程: 第40位访客来啦!
34线程: 第41位访客来啦!
33线程: 第42位访客来啦!
32线程: 第43位访客来啦!
31线程: 第44位访客来啦!
30线程: 第45位访客来啦!
29线程: 第46位访客来啦!
50线程: 第47位访客来啦!
49线程: 第48位访客来啦!
48线程: 第49位访客来啦!
47线程: 第50位访客来啦!

Process finished with exit code 0

所以可以看出 yield /sleep不会释放对象锁,别的线程进入不了。

3、yield和sleep释放锁的意义?

线程A和线程B竞争同一个代码块时,线程A获取锁执行Thread.yield,则A让出CPU执行权,让别的任务执行,可能会让CPU执行另外一个业务C,而C不竞争该同步快。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值