多线程常用操作方法

线程的命名与取得

由于多线程的状态不确定,所以线程的名字就成为了唯一的分辨标记,则在定义线程名称时一定要在线程启动之前设置名字,尽量不要重名,且尽量不要为已经启动动的线程修改名字。
由于线程状态的不确定,所以每次可以操作的都是正在执行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相关推荐

  1. Java学习笔记27

    Vector是List接口的实现类,支持List接口的全部功能,Vector类是基于数组实现的List类,在内部封装了一个动态的. 允许再分配的Object[]数组,Vector是线程安全的,无须程序 ...

  2. java学习(27):巩固练习

    /1 使用Eclipse编写控制台应用程, 使用while循环在控制台打印10行10列的如下图形 □ □ □ □ □ □ □ □ □ □ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ □ □ □ □ □ □ ...

  3. Java学习笔记(十)--控制台输入输出

    输入输出 一.控制台输入 在程序运行中要获取用户的输入数据来控制程序,我们要使用到 java.util 包中的 Scanner 类.当然 Java 中还可以使用其他的输入方式,但这里主要讲解 Scan ...

  4. Java入门1.2.3—一个老鸟的Java学习心得

    Java入门1.2.3-一个老鸟的Java学习心得 基本信息 作者: 臧萌    出版社:清华大学出版社 ISBN:9787302217831 上架时间:2010-3-30 出版日期:2010 年3月 ...

  5. javame学习_从零基础自学Java教程:648集全网最新Java学习教程,一学就会

    我们都知道Java的功能非常的强大,Java是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台(即J ...

  6. java学习中,字符串使用(比较、构造方法)(java 学习中的小记录)

    java学习中,字符串使用(比较.构造方法)(java 学习中的小记录)作者:王可利(Star·星星) String的使用 1.在内存中是如何保存字符串. == :比较的是地址(引用数据类型) equ ...

  7. java学习中,instanceof 关键字 和 final 关键字、值的传递(java 学习中的小记录)...

    java学习中,instanceof 关键字 和 final 关键字.值的传递(java 学习中的小记录)作者:王可利(Star·星星) instanceof 关键字 作用: 1.用来判断某个对象是否 ...

  8. 【Java学习笔记之二十六】深入理解Java匿名内部类

    在[Java学习笔记之二十五]初步认知Java内部类中对匿名内部类做了一个简单的介绍,但是内部类还存在很多其他细节问题,所以就衍生出这篇博客.在这篇博客中你可以了解到匿名内部类的使用.匿名内部类要注意 ...

  9. Android学习系列(27)--App缓存管理

    随笔- 53 文章- 10 评论- 1064 Android学习系列(27)--App缓存管理 无论大型或小型应用,灵活的缓存可以说不仅大大减轻了服务器的压力,而且因为更快速的用户体验而方便了用户. ...

  10. 2016最新Java学习计划

    一.Java学习路线图 二.Java学习路线图--视频篇 六大阶段 学完后目标 知识点 配套免费资源(视频+笔 记+源码+模板) 密码        第一阶段 Java基础 入门 学习周期: 35天 ...

最新文章

  1. 基类成员的public访问权限在派生类中变为_C++ 派生类的构造函数(学习笔记:第7章 06)...
  2. 求二叉树某个结点的祖先
  3. python调用api做用户登录认证_(二)Python调用Zabbix api之从入门到放弃——登录并获取身份验证令牌...
  4. Java文件读取 中文乱码
  5. firebird 3.0 开发者指南_11月19日召开 2020 vivo开发者大会报名正式开启
  6. 前端常用linux命令
  7. db2嵌套查询效率_db2性能优化
  8. matlab仿真三相交流电路,三相交流调压电路的MATLAB仿真
  9. 谜题39:您好,再见!
  10. 如何销毁一个实例化对象_基于脚本的游戏对象系统(1) 实例化、组件及生命周期...
  11. 简述python程序结构_Python-选择结构程序设计
  12. 第十八:如何定制Pytest+Allure2详细报告生成,给项目量身打造一套测试报告(重点超详细)
  13. CSU 1803 2016(数论)
  14. 最强AlphaGo怎样炼成?刚刚,DeepMind团队进行了全面解读
  15. 转:为 setuptools 开路搭桥
  16. 天梯赛L2-6 树的遍历
  17. java的oracle考试认证(OCJP)之路
  18. 软件测试界的三无简历,企业拿什么来招聘你,石沉大海的简历
  19. linux 7 开机启动脚本,centos7 超简单实现开机自动启动多脚本管理
  20. Linux通过LVM新增一个物理卷(硬盘),实现多个硬盘合并到一个逻辑硬盘

热门文章

  1. sgSpeedMode.js判断360浏览器是“兼容模式”,提示使用“极速模式”
  2. 手把手教你 用C++实现一个 可持久化 的http_server
  3. Go 分布式学习利器(19)-- Go并发编程 之 CSP(communicating sequential processes) 机制
  4. nyoj——297(期望)
  5. 性能测试之二——常用的性能测试策略
  6. Jmeter性能测试 入门
  7. MyBaties学习记录
  8. ArrayList Iterator remove java.lang.UnsupportedOperationException
  9. jquery选择器的使用方式
  10. 【Android动画】之Tween动画 (渐变、缩放、位移、旋转)