多线程 常见的线程方法
sleep()线程暂停
Thread.sleep(1000); 表示当前线程暂停1000毫秒 ,其他线程不受影响
Thread.sleep(1000); 会抛出InterruptedException 中断异常,因为当前线程sleep的时候,有可能被停止,这时就会抛出 InterruptedException
package multiplethread;
public class TestThread {public static void main(String[] args) {Thread t1= new Thread(){public void run(){int seconds =0;while(true){try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.printf("已经玩了LOL %d 秒%n", seconds++);} }};t1.start(); }
}
join()加入到当前线程中
首先解释一下主线程的概念
所有进程,至少会有一个线程即主线程,即main方法开始执行,就会有一个看不见的主线程存在。
在执行t.join,即表明在主线程中加入该线程。
主线程会等待该线程结束完毕, 才会往下运行。
package charactor;
import java.io.Serializable;
public class Hero{public String name;public float hp; public int damage;public void attackHero(Hero h) {try {//为了表示攻击需要时间,每次攻击暂停1000毫秒Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}h.hp-=damage;System.out.format("%s 正在攻击 %s, %s的血变成了 %.0f%n",name,h.name,h.name,h.hp);if(h.isDead())System.out.println(h.name +"死了!");}public boolean isDead() {return 0>=hp?true:false;}
}
package multiplethread;
import charactor.Hero;
public class TestThread {public static void main(String[] args) { final Hero gareen = new Hero();gareen.name = "盖伦";gareen.hp = 616;gareen.damage = 50;final Hero teemo = new Hero();teemo.name = "提莫";teemo.hp = 300;teemo.damage = 30;final Hero bh = new Hero();bh.name = "赏金猎人";bh.hp = 500;bh.damage = 65;final Hero leesin = new Hero();leesin.name = "盲僧";leesin.hp = 455;leesin.damage = 80;Thread t1= new Thread(){public void run(){while(!teemo.isDead()){gareen.attackHero(teemo);} }};t1.start();//代码执行到这里,一直是main线程在运行try {//t1线程加入到main线程中来,只有t1线程运行结束,才会继续往下走t1.join();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}Thread t2= new Thread(){public void run(){while(!leesin.isDead()){bh.attackHero(leesin);} }};//会观察到盖伦把提莫杀掉后,才运行t2线程t2.start();}
}
因为使用join将t1加入了主线程,主线程会最先执行,所以运行结果是先将线程t1执行结束,再执行t2.
setPriority()设置线程优先级
当线程处于竞争关系的时候,优先级高的线程会有更大的几率获得CPU资源
为了演示该效果,要把暂停时间去掉,多条线程各自会尽力去占有CPU资源
同时把英雄的血量增加100倍,攻击减低到1,才有足够的时间观察到优先级的演示
线程优先级的范围在1-10
如图可见,线程1的优先级是MAX_PRIORITY,所以它争取到了更多的CPU资源执行代码
package charactor;
import java.io.Serializable;
public class Hero{public String name;public float hp;public int damage;public void attackHero(Hero h) {h.hp-=damage;System.out.format("%s 正在攻击 %s, %s的血变成了 %.0f%n",name,h.name,h.name,h.hp);if(h.isDead())System.out.println(h.name +"死了!");}public boolean isDead() {return 0>=hp?true:false;}}
package multiplethread;
import charactor.Hero;
public class TestThread {public static void main(String[] args) {final Hero gareen = new Hero();gareen.name = "盖伦";gareen.hp = 6160;gareen.damage = 1;final Hero teemo = new Hero();teemo.name = "提莫";teemo.hp = 3000;teemo.damage = 1;final Hero bh = new Hero();bh.name = "赏金猎人";bh.hp = 5000;bh.damage = 1;final Hero leesin = new Hero();leesin.name = "盲僧";leesin.hp = 4505;leesin.damage = 1;Thread t1= new Thread(){public void run(){while(!teemo.isDead()){gareen.attackHero(teemo);} }};Thread t2= new Thread(){public void run(){while(!leesin.isDead()){bh.attackHero(leesin);} }};t1.setPriority(Thread.MAX_PRIORITY);t2.setPriority(Thread.MIN_PRIORITY);t1.start();t2.start();}
}
yield()临时暂停
yield中文翻译投降,起作用也差不多这个意思,当前线程,临时暂停,使得其他线程可以有更多的机会占用CPU资源,就像两个人抢吃的,甲,乙都想吃多点,打起来了,乙输了,就投降了,甲就吃的多,获取更多资源,但是不可能甲全吃了,乙还有不服的时候呢,就会加强锻炼,锻炼好了,就去再跟甲打架,来获取资源。这里跟sleep有明显的不同,sleep有固定的暂停时间,但是 yield只是临时认怂,没有固定时间。
package multiplethread;
import charactor.Hero;
public class TestThread {public static void main(String[] args) {final Hero gareen = new Hero();gareen.name = "盖伦";gareen.hp = 61600;gareen.damage = 1;final Hero teemo = new Hero();teemo.name = "提莫";teemo.hp = 30000;teemo.damage = 1;final Hero bh = new Hero();bh.name = "赏金猎人";bh.hp = 50000;bh.damage = 1;final Hero leesin = new Hero();leesin.name = "盲僧";leesin.hp = 45050;leesin.damage = 1;Thread t1= new Thread(){public void run(){while(!teemo.isDead()){gareen.attackHero(teemo);} }};Thread t2= new Thread(){public void run(){while(!leesin.isDead()){//临时暂停,使得t1可以占用CPU资源Thread.yield();bh.attackHero(leesin);} }};t1.setPriority(5);t2.setPriority(5);t1.start();t2.start();}
}
setDaemon()守护线程
守护线程的概念是: 当一个进程里,所有的线程都是守护线程的时候,结束当前进程。
举个实际的例子,就像我们打开一个LOL,我们打游戏的时候,后台会记录我们这一局输出多少,参团率多少等等,当本局游戏结束了,我们退出,返回主界面,那些记录我们参团率,输出的进行就相应的结束了。那些记录数据的线程就是守护进程,所以我们可以想一下,是不是当所有的进程都是这种记录的守护进程时,这个程序就没有运行的必要了,所以就结束了当前的进程。
守护线程通常会被用来做日志,性能统计等工作。
package multiplethread;
public class TestThread {public static void main(String[] args) {Thread t1= new Thread(){public void run(){int seconds =0;while(true){try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.printf("已经玩了LOL %d 秒%n", seconds++);} }};t1.setDaemon(true);t1.start();}
}
我们运行,会发现直接运行结束,因为进程里,所有的线程都是守护线程,所以结束当前进程。
多线程 常见的线程方法相关推荐
- 多线程系列教材 (二)- Java 常见的线程方法
步骤1:当前线程暂停 步骤2:加入到当前线程中 步骤3:线程优先级 步骤4:临时暂停 步骤5:守护线程 步骤6:练习-英雄充能 步骤7:答案-英雄充能 步骤8:练习-破解密码 步骤9:答案-破解密码 ...
- 多线程基础-常用线程方法(三)
1.notify和wait方法 为什么notify,wait方法在Object中? Monitor内置于每一个Object对象中,是一个同步工具,相当于操作系统中的互斥量,即值为1 的信号量.也可以称 ...
- java 线程访问控件_C#多线程与跨线程访问界面控件的方法
本文实例讲述了C#多线程与跨线程访问界面控件的方法.分享给大家供大家参考.具体分析如下: 在编写WinForm访问WebService时,常会遇到因为网络延迟造成界面卡死的现象.启用新线程去访问Web ...
- JAVA中的多线程(八):线程的优先级和yield方法
JAVA中的多线程(八):线程的优先级和yield方法 优先级代表着抢资源的频率 所有线程默认优先级是5 yield()临时释放线程的执行权 1 class Demo implements Runna ...
- 多线程编程:线程死锁的原因以及解决方法
多线程编程:线程死锁的原因以及解决方法 关于线程死锁这个问题相信程序员在编写多线程程序时会经常遇到的一个经典问题,这种情况往往出现在多个线程同时对临界资源访问时所产生的. 属于临界资源的硬件有打印机. ...
- 02 线程简介 多任务 多线程 普通方法调用和多线程 程序.进程.线程 Proces与Thread 核心概念
线程简介 任务,进程,线程,多线程 多任务 多任务处理是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务 多线程 原来是一条路,慢慢因为车太多了,道路堵塞,效率极低. 为了提高使用的 ...
- C#多线程下, 子线程如何让主线程执行方法
C#多线程下, 子线程如何让主线程执行方法 重现一下当时我的需求: 我开了多个线程, 来监视一个变量, 然后去执行一些方法. 看起来没什么毛病, 但是运行起来会报错 此对象被其他线程占用 一开始想着可 ...
- 获取返回值作为变量_解决多线程间共享变量线程安全问题的大杀器——ThreadLocal...
微信公众号:Zhongger 我是Zhongger,一个在互联网行业摸鱼写代码的打工人! 关注我,了解更多你不知道的[Java后端]打工技巧.职场经验等- 上一期,讲到了关于线程死锁.用户进程.用户线 ...
- 并发编程-12线程安全策略之常见的线程不安全类
文章目录 脑图 概述 字符串拼接子之StringBuilder.StringBuffer StringBuilder (线程不安全) StringBuffer (线程安全) 小结 时间相关的类 Sim ...
最新文章
- libACE-6.3.3.so: cannot open shared object file: No such file or directory
- JAVA入门[4]-IntelliJ IDEA配置Tomcat
- 进程管理supervisor的简单说明
- Android多线程死锁定位,Java---多线程之死锁
- dsst依赖opencv
- nginx 一个请求发给多台机器_配置Nginx实现负载均衡
- 25-60k/m | 湃道智能招聘
- 跨系统服务器data,跨服务器的数据整合方法及系统 Cross-server data integration method and system...
- 为什么 Facebook 活得春风得意,而人人网却半死不活?
- Android RatingBar使用Kotlin
- 中文乱码在java中URLEncoder.encode方法要调用两次解决
- C++中new和delete来创建和释放动态数组
- 腾讯微信惊天漏洞,利用手机号致帐号丢失无法找回!——论个人信息安全与防护...
- 当下学习Linux该选择哪个产品?
- 转:socks5协议详解
- 透明背景视频的制作与应用
- 贴片物料/电容/电阻的英制与公制封装
- 个人小程序 给头像戴圣诞帽
- python变量、运算符
- 高通全新WiFi方案支持Ayla物联网平台连接
热门文章
- Activiti 7 —— BPMN —— Visual Paradigm —— BPMN工作流程图组件了解应用、绘图、结构组成、案例学习
- 中兴三层交换机基本配置
- 使用Docker隔离wps
- OpenHarmony学习笔记
- js es6转es5
- Elgamal 加密算法
- Vim中安装自动补全插件YouCompleteMe
- [html] h标签
- 全国计算机等级考试二级教程——c语言程序设计》,格式为doc.,《全国计算机等级考试二级教程C语言程序设计》汇编.doc...
- 阿莫电子论坛 莫进明 涉嫌用户数量造假