菜鸡的Java笔记 - java 线程常用操作方法
线程常用操作方法
线程的命名操作,线程的休眠,线程的优先级
线程的所有操作方法几乎都在 Thread 类中定义好了
线程的命名和取得
从本质上来讲多线程的运行状态并不是固定的。所以来讲爱那个要想确定线程的执行,唯一的区别就在于线程的名称上
在起名的时候就应该尽可能的避免重名,或者避免修改名称
在 Thread 类中提供有如下的方法可以实现线程名称的操作:
构造方法: public Thread(Runnable target, String name)
设置名字: public final void setName(String name)
取得名字: public final String getName()
既然线程的执行本身是不确定的状态,所以如果要取得线程名字的话,那么唯一能做的就是取得当前的线程名字
所以在 Thread 类里面提供有这样的方法: public static Thread currentThread()
范例:线程的命名和取得
package cn.mysterious.study3;
class MyThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName() + ",i = " + i);
}
}
}
public class StudyThread {
public static void main(String[] args) throws Exception {
MyThread mt = new MyThread();
new Thread(mt,"线程A").start();
new Thread(mt).start();
new Thread(mt).start();
}
}
如果在设置线程对象是没有设置具体的名字,那么就采用一个默认的名字进行定义
范例:观察代码
package cn.mysterious.study3;
class MyThread implements Runnable{
@Override
public void run() {
System.out.println("MyThread 线程类:" + Thread.currentThread().getName());
}
}
public class StudyThread {
public static void main(String[] args) throws Exception {
MyThread mt = new MyThread();
new Thread(mt).start(); // 线程启动调用 run() 方法
mt.run(); // 直接通过对象调用 run() 方法
}
}
/*
结果:
MyThread 线程类:main
MyThread 线程类:Thread-0
*/
MyThread 线程类:main ( mt.run(); )
MyThread 线程类:Thread-0 (new Thread(mt).start();)
线程一定是依附在进程存在的,但是现在的进程在哪里呢?
每当使用java命令在JVM上解释某一个程序执行的时候,那么都会默认的启动一个JVM的进程,而主方法只是这进程中的一个线程,所以整个程序一直都跑在线程的运行机制上
每个JVM至少会启动两个线程:主线程,GC线程
线程的休眠
如果要想让某些线程延缓执行,俺么就可以使用休眠的方式来进行处理
在 Thread 类里面提供有如下的休眠操作:
休眠方法: public static void sleep(long millis,int nanos)throws InterruptedException
如果休眠的时间没到就停止休眠了,那么就会产生中断异常
范例:观察休眠
package cn.mysterious.study3;
class MyThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ",i = " + i);
}
}
}
public class StudyThread {
public static void main(String[] args) throws Exception {
MyThread mt = new MyThread();
new Thread(mt,"线程A").start();
new Thread(mt,"线程B").start();
new Thread(mt,"线程C").start();
}
}
以上的代码执行中感觉像是所有的线程对象都同时休眠了。但是严格来讲不是同时,是有先后顺序的,只不过这个顺序小一点而已
package cn.mysterious.study3;
class MyThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ",i = " + i);
}
}
}
public class StudyThread {
public static void main(String[] args) throws Exception {
MyThread mt = new MyThread();
Thread t = new Thread(mt,"线程A");
t.start();
Thread.sleep(2000);
t.interrupt(); // 中断
}
}
后续会使用休眠来进行线程的分析
线程的优先级
从理论上来讲优先级越高的线程越有可能先执行。而在 Thread 类里面定义有一下的优先级操作方法:
设置优先级: public final void setPriority(int newPriority)
取得优先级: public final int getPriority()
而对于优先级一共定义有三种:
最高优先级: public static final int MAX_PRIORITY: 10
中等优先级: public static final int NORM_PRIORITY: 5
最小优先级: public static final int MIN_PRIORITY: 1
范例:观察优先级
package cn.mysterious.study3;
class MyThread implements Runnable{
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i < 100; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ",i = " + i);
}
}
}
public class StudyThread {
public static void main(String[] args) throws Exception {
MyThread mt = new MyThread();
Thread t1 = new Thread(mt,"线程A");
Thread t2 = new Thread(mt,"线程B");
Thread t3 = new Thread(mt,"线程C");
// 设置优先级
t1.setPriority(Thread.MAX_PRIORITY);
t2.setPriority(Thread.MIN_PRIORITY);
t3.setPriority(Thread.MIN_PRIORITY);
t1.start();
t2.start();
t3.start();
}
}
范例:主线程的优先级是什么呢?
public class StudyThread {
public static void main(String[] args) throws Exception {
System.out.println(Thread.currentThread().getPriority());
}
}
可以发现主线程属于中等优先级或者叫一般优先级
总计
1.线程要有名字, Thread.currentThread 取得当前线程
2.线程的休眠是有先后顺序的
3.理论上线程的优先级越高越有可能先执行
菜鸡的Java笔记 - java 线程常用操作方法的更多相关文章
- 进阶Java编程(2)线程常用操作方法
线程常用操作方法 多线程的主要操作方法都在Thread类中定义的. 1,线程的命名和取得 多线程的运行状态是不确定的,那么在程序的开发之中为了可以获取到一些需要使用到的线程就只能依靠线程的名字来进行操 ...
- Java 笔记 —— java 和 javac
Java 笔记 -- java 和 javac h2{ color: #4ABCDE; } a{ text-decoration: none !important; } a:hover{ color: ...
- java笔记--使用线程池优化多线程编程
使用线程池优化多线程编程 认识线程池 在Java中,所有的对象都是需要通过new操作符来创建的,如果创建大量短生命周期的对象,将会使得整个程序的性能非常的低下.这种时候就需要用到了池的技术,比如数据库 ...
- java 笔记(5) —— 线程,yield,join
一.线程各个状态与转换: 新建状态:用new语句创建的线程对象处于新建状态,此时它和其它的java对象一样,仅仅在堆中被分配了内存 .就绪状态:当一个线程创建了以后,其他的线程调用了它的start() ...
- java笔记--守护线程的应用
守护线程的应用 Java中的线程可以分为两类,即用户线程和守护线程.用户线程是为了完成任务,而守护线程是为其他线程服务 --如果朋友您想转载本文章请注明转载地址"http://www.cnb ...
- 菜鸡的Java笔记 - java 常用类库
CommonClassLibrary 常用类库 定时调度 定时调度指的是每到一个时刻,都会自动的产生某些特定的操作形式 con ...
- 菜鸡的Java笔记 - java 线程的同步与死锁 (同步 synchronization,死锁 deadlock)
线程的同步与死锁 (同步 synchronization,死锁 deadlock) 多线程的操作方法 1.线程同步的产生与解决 2.死锁的问题 ...
- 菜鸡的Java笔记 - java 正则表达式
正则表达式 RegularExpression 了解正则表达式的好处 正则表达式的基础语法 正则表达式的具体操作 content (内容 ...
- 菜鸡的Java笔记 java基础类库 BaseClassLibrary
java基础类库 BaseClassLibrary StringBuffer 类的特点 StringBuffer,StringBuilder,String 类之间的关系 ...
随机推荐
- Sentry 监控 - Snuba 数据中台架构简介(Kafka+Clickhouse)
系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...
- Vue自定义标签页,并且在其中渲染Echarts图表
目录 一.需求说明 二.标签页功能实现 一.需求说明 1.点击标签按钮切换不同的echarts图表,考虑用Ant Design Vue,但是其样式无法自定义 2.div的整体布局样式使用tailwin ...
- Java基础之(十二):数组
数组 数组概述 定义 数组是相同类型数据的有序集合. 数组描述的是相同类型的若干数据,按照一定的先后次序排列组合而成. 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们. 数组 ...
- Java课堂测试1第三阶段
package sizeyunsuan;//import java.util.Scanner;//import java.util.Random;import java.util.*; public ...
- 「JOISC 2020 Day2」变态龙之色 题解
题目传送门 注意 同性必定不同色 必有一个同色异性,且不相互不喜欢 Solution 我们发现,我们问题比较大的就是如何确定性别问题.我们可以一个一个加进去,在原来已经确定了的二分图上增加新的性别关系 ...
- 题解 [NOI2014]购票
题目传送门 题目大意 有一个 \(n\) 个点的树,每个点有三个值 \(p_u,q_u,l_u\) ,现在可以从 \(u\) 走到点 \(v\) 当且仅当 \(v\) 是 \(u\) 的祖先并且 \( ...
- cf1082D Maximum Diameter Graph(构造+模拟+细节)
QWQ不得不说 \(cf\)的\(edu\ round\)出这种东西 有点太恶心了 题目大意:给你\(n\)个点,告诉你每个点的最大度数值(也就是说你的度数要小于等于这个),让你构造一个无向图,使其满 ...
- MyBatis 中两表关联查询MYSQL (14)
MyBatis 中两表关联查询MYSQL 1.创建数据库表语句 2.插入测试数据 3.pom文件内容 <?xml version="1.0" encoding="U ...
- keras框架下的深度学习(一)手写体识别
这个系列文章主要记录使用keras框架来搭建深度学习模型的学习过程,其中有一些自己的想法和体会,主要学习的书籍是:Deep Learning with Python,使用的IDE是pycharm. 在 ...
- Kali安装OWASP
我是2019版的kali,里面并没有自带OWASP工具,因为OWASP不再更新的因素,所以新版kali将它移除了 安装OWASP apt-get install zaproxy #以下都是安装软件时 ...