从头认识多线程-1.13 yield在使用前后,计算时间的差别

这一章节我们讨论yield的使用。

1.yield的作用

当我们使用这个方法的时候,我们会让出cup的控制时间,让其他线程计算

2.代码清单

package com.ray.deepintothread.ch01.topic_13;

public class YieldSample {
	public static void main(String[] args) throws InterruptedException {
		ThreadOne threadOne = new ThreadOne();
		Thread thread = new Thread(threadOne);
		thread.start();
	}
}

class ThreadOne implements Runnable {

	@Override
	public void run() {
		long startTime = System.currentTimeMillis();
		for (int i = 0; i < 1000000; i++) {
			Thread.yield();
		}
		long endTime = System.currentTimeMillis();
		System.out.println(endTime - startTime);
	}
}

输出:

192

当我们注释了Thread.yield()这一句,输出是:

1

对比两个输出我们可以看见,由于使用yield方法让出了cup的时间片段,因此计算时间比独占线程的要多得多。

总结:这一章节展示了使用yield方法前后的计算时间的差别

我的github:https://github.com/raylee2015/DeepIntoThread

时间: 2024-11-09 08:46:29

从头认识多线程-1.13 yield在使用前后,计算时间的差别的相关文章

从头认识多线程-2.13 由同步的synchronized (newobject()) 引起的异步现象和脏读

这一章节我们来讨论一下由同步的synchronized (newobject()) 引起的异步现象和脏读. 1.代码清单 package com.ray.deepintothread.ch02.topic_14; /** * * @author RayLee * */ public class AsynchOfSynchWithUnSameObject { public static void main(String[] args) throws InterruptedException { M

了解多线程中的yield

最近在学习多线程这一块,发现里面有好多让人产生误区的地方,今天我来分析下java多线程中的yield功能,希望其他朋友也可以从中学习到相关知识. 开始之前先看下面一幅图: 这幅图表示线程的运行状态:新建--->就绪<--阻塞-->运行---->死亡 yield从字面上看是礼让的意思,顾名思义就是让其他线程有执行的机会.这里有个很大的误区,以为执行yield方法就能暂停当前线程让其他线程执行,这是错误的. yield方法只是让当前执行的线程从"运行"状态转变为&q

从头认识多线程-2.8 缓解同步方法的隐患-同步代码块

这一章节我们来讨论一下缓解同步方法的隐患-同步代码块. 1.思路:把同步方法,降低同步的粒度,同步到代码块 2.根据上一章节的例子,我们把代码修改一下 (1)第一种方法,把同步标记移到更新的那一栏里面去,一般来说大部分都是更新的时候需要同步数据 package com.ray.deepintothread.ch02.topic_9; /** * 从头认识多线程-2.8 缓解同步方法的隐患-同步代码块<br> * * @author RayLee * */ public class Relief

多线程IO操作(扫描文件夹并计算总大小)

场景为,给到一个硬盘上文件或文件夹,(当然文件夹时,多线程的优势才能越发体现出来),得到该文件或文件夹的大小和计算该结果所需要的时间. 首先是单线程下的例子,这个可难不倒大家,代码如下: 01 public class TotalFileSizeSequential { 02   private long getTotalSizeOfFilesInDir(final File file) { 03     if (file.isFile()) return file.length(); 04  

Java基础复习(2) 多线程相关 sleep() yield() wait() join()等方法简略说明

2015-10-23 今天回顾的是多线程的部分,对于线程编程常用的几个方法稍作整理和区分. 1.join方法 (之前总是记的迷迷糊糊,重新看了一遍,算是基本理清了orz) join方法属于线程,意思是把指定线程加入到当前线程执行序列,可以让本来是交替执行的两个线程合并成顺序执行的线程.例如:同时执行线程thread-A和线程thread-B,此时在线程thread-B中调用线程thread-A的join()方法,结果就是直到线程thread-A执行完毕,线程thread-B才继续执行. 使用:

从头认识多线程-2.14 解决由同步的synchronized (newobject()) 引起的脏读的方法

这一章节我们来讨论一下解决由同步的synchronized (newobject()) 引起的脏读的方法. 1.造成上面脏读的原因:多线程多方法同时访问并修改某个属性域 2.解决思路 顺着上面的原因,笔者提出两种不是方法的方法 (1)只能单线程单方法访问并修改某个属性域这样就保证了执行的顺序(也就是需要同步所有访问并修改的步骤)(缺点:性能低下,优点:数据的强一致性) (2)在多线程多方法的情况下,只能够访问多个属性域,不能够同时访问并修改某一个单一的属性域(根本目的就是分开运算,但是,在生产环

从头认识多线程-2.24 修改监视器对同步的影响

这一章节我们来讨论一下修改监视器对同步的影响. 1.不修改监视器,同步的 package com.ray.deepintothread.ch02.topic_24; /** * * @author RayLee * */ public class SynchOfStaticInnerClass { public static void main(String[] args) { Thread thread = new Thread(new Runnable() { public void run

从头认识多线程-4.1 对象的发布(Publish)、逸出(Escape)以及逸出的解决方案

这一章节我们来讨论一下对象的发布与逸出. 其实在前两个章节我们都有想应的讨论,只不过有一些不用补充的问题,我将会放到这个章节里面去. 1.发布(Publish) 当一个对象能够给其他代码引用. package com.ray.deepintothread.ch04.topic_1; import java.util.HashMap; public class Publish { private HashMap<String, Object> map = null; public HashMap

从头认识多线程-2.15 证明使用属性域作为多线程监视器是不同步的

这一章节接着上一章节最后的错误的思路,我们来证明使用整数属性域作为多线程监视器是不同步的. 1.用同一个属性域作为多线程监视器,是不同步的 package com.ray.deepintothread.ch02.topic_16; /** * * @author RayLee * */ public class DirtyReadWithSynchBlock { public static void main(String[] args) throws InterruptedException