Java学习总结:27
多线程常用操作方法
线程的命名与取得
由于多线程的状态不确定,所以线程的名字就成为了唯一的分辨标记,则在定义线程名称时一定要在线程启动之前设置名字,尽量不要重名,且尽量不要为已经启动动的线程修改名字。
由于线程状态的不确定,所以每次可以操作的都是正在执行run()方法的线程,那么取得当前线程对象的方法为:public static Thread current Thread()。
例:观察线程的命名
package Project.Study.Multithreading;
class MyTread4 implements Runnable{@Overridepublic void run(){System.out.println(Thread.currentThread().getName());//使用currentThread()取得当前线程对象后再取得具体的线程名字}
}
public class Test4 {public static void main(String [] args) throws Exception{MyTread4 mt=new MyTread4();new Thread(mt,"自己的线程A").start();new Thread(mt).start();new Thread(mt,"自己的线程B").start();new Thread(mt).start();new Thread(mt).start();}
}
//结果:
//自己的线程A
//Thread-1
//自己的线程B
//Thread-0
//Thread-2
例:取得线程名字
package Project.Study.Multithreading;
class MyTread4 implements Runnable{@Overridepublic void run(){System.out.println(Thread.currentThread().getName());//使用currentThread()取得当前线程对象后再取得具体的线程名字}
}
public class Test4 {public static void main(String [] args) throws Exception{MyTread4 mt=new MyTread4();new Thread(mt,"自己的线程A").start();new Thread(mt).start();mt.run();}
}
//结果:
//main
//自己的线程A
//Thread-0
通过本程序我们可以发现主方法本身也属于一个线程。
每一个JVM进程都至少启动以下两个线程:
1.main线程:程序的主要执行,以及启动子程序;
2.gc线程:负责垃圾收集。
线程的休眠
线程的休眠指的是让程序的执行速度变慢一些,在Thread类中线程的休眠操作方法为:public static void sleep(long millis)throws InterruptedException,设置的休眠单位是毫秒(ms)。
例:观察休眠特点
package Project.Study.Multithreading;class MyThread5 implements Runnable{@Overridepublic void run(){for (int x=0;x<10;x++){try {Thread.sleep(1000); //每次执行休眠1s}catch (InterruptedException e){e.printStackTrace();}System.out.println(Thread.currentThread().getName()+",x="+x);}}
}
public class Test5 {public static void main(String []args){MyThread5 mt1=new MyThread5();MyThread5 mt2=new MyThread5();MyThread5 mt3=new MyThread5();new Thread(mt1,"自己的线程对象A").start();new Thread(mt2,"自己的线程对象B").start();new Thread(mt3,"自己的线程对象C").start();}
}
//结果:
//自己的线程对象B,x=0
//自己的线程对象A,x=0
//自己的线程对象C,x=0
//自己的线程对象A,x=1
//自己的线程对象B,x=1
//自己的线程对象C,x=1
//自己的线程对象B,x=2
//自己的线程对象A,x=2
//自己的线程对象C,x=2
//...
//自己的线程对象C,x=9
//自己的线程对象B,x=9
//自己的线程对象A,x=9
上面这个程序的结果是三个三个输出的(其实是一种错觉),每隔一秒输出三个线程对象,由于线程切换速度过快,所以会有一种所有线程同时进入run()方法中的感觉,而实际上是有先后差距的。
线程优先级
在Java的线程操作中,优先级高的线程就可能先被执行。线程的优先级如下图所示:
线程优先级操作
No. | 方法或常量 | 类型 | 描述 |
---|---|---|---|
1 | public static final int MAX_PRIORITY | 常量 | 最高优先级,数值为10 |
2 | public static final int NORM_PRIORITY | 常量 | 中等优先级,数值为5 |
3 | public static final int MIN_PRIORITY | 常量 | 最低优先级,数值为1 |
4 | public final void setPriority(int new Priority) | 普通 | 设置线程优先级 |
5 | public final int getPriority(); | 普通 | 取得线程优先级 |
例:设置线程优先级
package Project.Study.Multithreading;class MyThread6 implements Runnable{@Overridepublic void run(){for(int x=0;x<20;x++){try {Thread.sleep(100);}catch (InterruptedException e){e.printStackTrace();}System.out.println(Thread.currentThread().getName()+",x="+x);}}
}
public class Test6 {public static void main(String [] args){MyThread6 mt1 = new MyThread6();Thread t1 = new Thread(mt1,"自己的线程对象A");Thread t2= new Thread(mt1,"自己的线程对象B");Thread t3=new Thread(mt1,"自己的线程对象C");t1.setPriority(Thread.MIN_PRIORITY);t2.setPriority(Thread.MAX_PRIORITY);t3.setPriority(Thread.NORM_PRIORITY);t1.start();t2.start();t3.start();}
}
//结果:
//自己的线程对象C,x=0
//自己的线程对象A,x=0
//自己的线程对象B,x=0
//自己的线程对象A,x=1
//自己的线程对象C,x=1
//自己的线程对象B,x=1
//自己的线程对象C,x=2
//自己的线程对象A,x=2
//自己的线程对象B,x=2
//自己的线程对象B,x=3
//自己的线程对象C,x=3
//自己的线程对象A,x=3
//自己的线程对象B,x=4
//自己的线程对象A,x=4
//自己的线程对象C,x=4
//...
//自己的线程对象C,x=19
//自己的线程对象B,x=19
//自己的线程对象A,x=19
从运行结果可以看出,线程的执行顺序不一定按照设定的优先级执行,这是因为线程不一定能获得cpu资源。
探究:主方法的优先级
public class Test6 {public static void main(String [] args){System.out.println(Thread.currentThread().getPriority());}
}
//结果:
//5
由此可知,主方法的优先级为5
Java学习总结:27相关推荐
- Java学习笔记27
Vector是List接口的实现类,支持List接口的全部功能,Vector类是基于数组实现的List类,在内部封装了一个动态的. 允许再分配的Object[]数组,Vector是线程安全的,无须程序 ...
- java学习(27):巩固练习
/1 使用Eclipse编写控制台应用程, 使用while循环在控制台打印10行10列的如下图形 □ □ □ □ □ □ □ □ □ □ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ □ □ □ □ □ □ ...
- Java学习笔记(十)--控制台输入输出
输入输出 一.控制台输入 在程序运行中要获取用户的输入数据来控制程序,我们要使用到 java.util 包中的 Scanner 类.当然 Java 中还可以使用其他的输入方式,但这里主要讲解 Scan ...
- Java入门1.2.3—一个老鸟的Java学习心得
Java入门1.2.3-一个老鸟的Java学习心得 基本信息 作者: 臧萌 出版社:清华大学出版社 ISBN:9787302217831 上架时间:2010-3-30 出版日期:2010 年3月 ...
- javame学习_从零基础自学Java教程:648集全网最新Java学习教程,一学就会
我们都知道Java的功能非常的强大,Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即J ...
- java学习中,字符串使用(比较、构造方法)(java 学习中的小记录)
java学习中,字符串使用(比较.构造方法)(java 学习中的小记录)作者:王可利(Star·星星) String的使用 1.在内存中是如何保存字符串. == :比较的是地址(引用数据类型) equ ...
- java学习中,instanceof 关键字 和 final 关键字、值的传递(java 学习中的小记录)...
java学习中,instanceof 关键字 和 final 关键字.值的传递(java 学习中的小记录)作者:王可利(Star·星星) instanceof 关键字 作用: 1.用来判断某个对象是否 ...
- 【Java学习笔记之二十六】深入理解Java匿名内部类
在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...
- Android学习系列(27)--App缓存管理
随笔- 53 文章- 10 评论- 1064 Android学习系列(27)--App缓存管理 无论大型或小型应用,灵活的缓存可以说不仅大大减轻了服务器的压力,而且因为更快速的用户体验而方便了用户. ...
- 2016最新Java学习计划
一.Java学习路线图 二.Java学习路线图--视频篇 六大阶段 学完后目标 知识点 配套免费资源(视频+笔 记+源码+模板) 密码 第一阶段 Java基础 入门 学习周期: 35天 ...
最新文章
- 基类成员的public访问权限在派生类中变为_C++ 派生类的构造函数(学习笔记:第7章 06)...
- 求二叉树某个结点的祖先
- python调用api做用户登录认证_(二)Python调用Zabbix api之从入门到放弃——登录并获取身份验证令牌...
- Java文件读取 中文乱码
- firebird 3.0 开发者指南_11月19日召开 2020 vivo开发者大会报名正式开启
- 前端常用linux命令
- db2嵌套查询效率_db2性能优化
- matlab仿真三相交流电路,三相交流调压电路的MATLAB仿真
- 谜题39:您好,再见!
- 如何销毁一个实例化对象_基于脚本的游戏对象系统(1) 实例化、组件及生命周期...
- 简述python程序结构_Python-选择结构程序设计
- 第十八:如何定制Pytest+Allure2详细报告生成,给项目量身打造一套测试报告(重点超详细)
- CSU 1803 2016(数论)
- 最强AlphaGo怎样炼成?刚刚,DeepMind团队进行了全面解读
- 转:为 setuptools 开路搭桥
- 天梯赛L2-6 树的遍历
- java的oracle考试认证(OCJP)之路
- 软件测试界的三无简历,企业拿什么来招聘你,石沉大海的简历
- linux 7 开机启动脚本,centos7 超简单实现开机自动启动多脚本管理
- Linux通过LVM新增一个物理卷(硬盘),实现多个硬盘合并到一个逻辑硬盘
热门文章
- sgSpeedMode.js判断360浏览器是“兼容模式”,提示使用“极速模式”
- 手把手教你 用C++实现一个 可持久化 的http_server
- Go 分布式学习利器(19)-- Go并发编程 之 CSP(communicating sequential processes) 机制
- nyoj——297(期望)
- 性能测试之二——常用的性能测试策略
- Jmeter性能测试 入门
- MyBaties学习记录
- ArrayList Iterator remove java.lang.UnsupportedOperationException
- jquery选择器的使用方式
- 【Android动画】之Tween动画 (渐变、缩放、位移、旋转)