java线程中yield()和join()的区别
多线程在面试中是非常受欢饮的题目,我个人认为我们很少有机会能够真正的用到复杂的多线程(我在7年前使用过一次),熟悉这些概念能够增加你的信心,先前,我已经讨论了一个相似的问题,wait()和sleep()的区别。现在我们讨论一下join()和yield()的区别。坦白的讲,我在实际中比没有用过这两种方法,如果你觉得有问题请在评论中提出来
java 线程调度的背景
理解线程的优先级
yield方法
/*** A hint to the scheduler that the current thread is willing to yield its current use of a processor. The scheduler is free to ignore* this hint. Yield is a heuristic attempt to improve relative progression between threads that would otherwise over-utilize a CPU.* Its use should be combined with detailed profiling and benchmarking to ensure that it actually has the desired effect.*/public static native void yield();
我们列一下上边定义的一些重要的点
yield()方法使用的例子
package test.core.threads;public class YieldExample
{public static void main(String[] args){Thread producer = new Producer();Thread consumer = new Consumer();producer.setPriority(Thread.MIN_PRIORITY); //Min Priorityconsumer.setPriority(Thread.MAX_PRIORITY); //Max Priorityproducer.start();consumer.start();}
}class Producer extends Thread
{public void run(){for (int i = 0; i < 5; i++){System.out.println("I am Producer : Produced Item " + i);Thread.yield();}}
}class Consumer extends Thread
{public void run(){for (int i = 0; i < 5; i++){System.out.println("I am Consumer : Consumed Item " + i);Thread.yield();}}
}
不使用yield方法的输出
I am Consumer : Consumed Item 1
I am Consumer : Consumed Item 2
I am Consumer : Consumed Item 3
I am Consumer : Consumed Item 4
I am Producer : Produced Item 0
I am Producer : Produced Item 1
I am Producer : Produced Item 2
I am Producer : Produced Item 3
I am Producer : Produced Item 4
I am Consumer : Consumed Item 0
I am Producer : Produced Item 1
I am Consumer : Consumed Item 1
I am Producer : Produced Item 2
I am Consumer : Consumed Item 2
I am Producer : Produced Item 3
I am Consumer : Consumed Item 3
I am Producer : Produced Item 4
I am Consumer : Consumed Item 4
join()方法
//Waits for this thread to die.public final void join() throws InterruptedException
在join方法中设定超时,可以设定在指定的时间内无效。当超时到达,主线程和任务线程都可能被执行,但是,因为有sleep,join需要根据OS的时间规定来执行,所以你不应该假定线程和你指定的时间是一样的
join方法使用的例子
package test.core.threads;public class JoinExample
{public static void main(String[] args) throws InterruptedException{Thread t = new Thread(new Runnable(){public void run(){System.out.println("First task started");System.out.println("Sleeping for 2 seconds");try{Thread.sleep(2000);} catch (InterruptedException e){e.printStackTrace();}System.out.println("First task completed");}});Thread t1 = new Thread(new Runnable(){public void run(){System.out.println("Second task completed");}});t.start(); // Line 15t.join(); // Line 16t1.start();}
}Output:First task started
Sleeping for 2 seconds
First task completed
Second task completed
这就是一个很小但是很重要的概念的全部。
java线程中yield()和join()的区别相关推荐
- java线程 yield_Java线程中yield与join方法的区别
长期以来,多线程问题颇为受到面试官的青睐.虽然我个人认为我们当中很少有人能真正获得机会开发复杂的多线程应用(在过去的七年中,我得到了一个机会),但是理解多线程对增加你的信心很有用.之前,我讨论了一个w ...
- 线程中start()与run()的区别
每个线程都有要执行的任务.线程的任务处理逻辑可以在Tread类的run实例方法中直接实现或通过该方法进行调用,因此 run()相当于线程的任务处理逻辑的入口方法,它由Java虚拟机在运行相应线程时直接 ...
- java线程礼让yield
java线程礼让yield 1.yield方法 使用Thread类的静态方法yield可以对当前线程进行礼让,yield方法使线程从运行状态转换到就绪状态, 这与sleep方法对比,sleep是使 ...
- java 线程 获取消息_获取java线程中信息
怎样获取java线程中信息? 在进行多线程编程中,比较重要也是比较困难的一个操作就是如何获取线程中的信息.大多数人会采取比较常见的一种方法就是将线程中要返回的结果存储在一个字段中,然后再提供一个获取方 ...
- java 线程中创建线程_如何在Java 8中创建线程安全的ConcurrentHashSet?
java 线程中创建线程 在JDK 8之前,还没有办法在Java中创建大型的线程安全的ConcurrentHashSet. java.util.concurrent包甚至没有一个名为Concurren ...
- 线程中的同步和异步的区别
线程中的同步和异步的区别 一.同步 所谓同步,就是发出一个功能调用时,在没有得到结果之前,该调用就不返回或继续执行后续操作.是多个线程同时访问同一资源,等待资源访问结束,浪费时间,效率不 ...
- Java线程中sleep()、wait()和notify()、suspend()和resume()、yield()、join()、interupt()的用法和区别
从操作系统的角度讲,os会维护一个ready queue(就绪的线程对列).并在某一时刻CPU只为ready queue中位于队列头部的线程服务.但是当前正在被服务的线程可能觉得cpu的服务质量不够好 ...
- Java线程中wait、await、sleep、yield、join用法总结
文章目录 一.wait().notify().notifyAll()用法 二.await().signal().signalAll()用法 三 .yield().join()用法 四.wait().a ...
- Java线程中,Blocked,Wait,以及TIMED_WAIT的区别
根据jdk1.6的api,java的Thread类,定义了六个状态: 线程状态.线程可以处于下列状态之一: NEW 至今尚未启动的线程处于这种状态. RUNNABLE 正在 Java 虚拟机中执行的线 ...
最新文章
- 溯因推理:人工智能的盲点
- Android 实现布局动态加载
- hht时频谱 matlab 乱序_频谱、能量谱、功率谱的区别与联系
- 面试官:new一个对象的过程中发生了什么
- 安装Google Object Detection API
- 《蘑菇街编程题》回文串
- java entitymanager类_如何在Java JDBC EntityManagerFactory类中设置实体的ID?
- oracle foreign 查询,ORACLE foreign key
- 实战 RocketMQ 流量削峰,怎么能错过这一篇!
- ES6新特性_变量的解构赋值---JavaScript_ECMAScript_ES6-ES11新特性工作笔记006
- C++横板格斗小游戏(基于Easyx图形库)
- 《平凡的世界》造就不平凡的人生 --路遥
- outlook安全模式修复_Outlook Com安全漏洞Microsoft无法修复
- java root权限_Android应用获取Root权限
- mysql忘记密码问题
- AirDisk存宝 【S3和S6后面的USB口是用来干嘛的?有什么作用?】
- 对WEB应用的粗浅理解
- 股市跌跌不休,IPO能救市吗?
- org.hibernate.MappingException: Unknown entity: dxm.com.vo.User
- 想骂人!开发语言不能统一成一个么?
热门文章
- h5画三角形_H5如何在网页中绘制三角形,值得一看
- 修改密码后,mac的邮箱登录不上(已解决)
- 嘴上老喊辞职的人总也不走,如何看待这种现象?
- 对于任一整数n,符号函数sign(n)的定义如下
- 改进YOLOv5 | Stand-Alone Self-Attention | 针对视觉任务的独立自注意力层 | 搭建纯注意力FPN+PAN结构
- 报错:‘Concatenate’layer requires inputs with matching shapes expect for the concat axis. 解决思路
- 蚂蚁金服面试题和答案
- snipaste滚动截图方法_截图、拼图、图像编辑太麻烦?试试这款免费截图软件
- 关于MSP430单片机串口通信数据丢失问题
- 关于Banner制作有感(antD+react)