Java多线程的常见方法
时间:2022-07-22
本文章向大家介绍Java多线程的常见方法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
三种多线程实现方式的优缺点
优点 |
缺点 |
|
---|---|---|
实现Runnable、Callable接口 |
扩展性强,实现该接口的同时还可以继承其他的类 |
编程相对复杂,不能直接使用Thread类的方法 |
继承Thread类 |
编程比较简单,可以直接使用Thread类中的方法 |
扩展性较差,不能继承其他的类 |
获取和设置线程名称
获取线程的名称
- String getName() :返回此线程的名称
设置线程的名称
- 直接在创建对象时通过构造方法传参
- void setName(String name)
public class MyThread extends Thread {
public MyThread() {}
public MyThread(String name) {
super(name);
}
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(getName()+"线程开启了" + i);
}
}
}
public class MyThreadTest {
public static void main(String[] args) {
MyThread t1 = new MyThread("小明");
MyThread t2 = new MyThread("小红");
// 使用setName()
// t1.setName("小明");
// t2.setName("小红");
t1.start();
t2.start();
}
}
注意:线程是有默认名字的,为Thread-编号
获取当前线程的对象
- public static Thread currentThread() :返回当前正在执行的线程对象的引用
- 作用:当使用 实现Runnable 创建线程时,不可以直接使用getName(),此时应该用 Thread.currentThread().getName()
public class MyRunnable implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName()+"第二种方式"+i);
}
}
}
线程休眠
- public static void sleep(long time) :让线程休眠指定的时间,单位为毫秒。
@Override
public void run() {
while (true) {
try {
//线程休眠
Thread.sleep(800);
System.out.println(" ----First Thread----");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
后台线程/守护线程
- 当线程停止时,守护线程也随之停止。
- public final void sedDaemon(boolean on) :设置为守护线程
public class test {
public static void main(String[] args) {
Runnable1 runnable1 = new Runnable1();
Runnable2 runnable2 = new Runnable2();
Thread thread1 = new Thread(runnable1,"线程一");
Thread thread2 = new Thread(runnable2,"线程二");
// 设置线程二为守护线程
thread2.setDaemon(true);
thread1.start();
thread2.start();
}
}
class Runnable1 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 10; i++) {
System.out.println(Thread.currentThread().getName()+"执行了"+i);
}
}
}
class Runnable2 implements Runnable{
@Override
public void run() {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName()+"执行了"+i);
}
}
}
线程调度多线程的并发运行:
计算机中的CPU,在任意时刻只能执行一条机器指令。每个线程只有获得CPU的使用权才能执行代码。各个线程轮流获得CPU的使用校,分别执行各自的任务。
线程调度
线程有两种调度模型·分时调度模型:
- 所有线程轮流使用CPU的使用权,平均分配每个线程占用CPU的时间片
- 抢占式调度模型:优先让优先级高的线程使用CPU,如果线程的优先级相同,那么会雕机选择一个,优先级高的线程获取的CPU时间片相对多一些
- Java使用的是抢占式调度模型
线程的优先级
- public final void setPriority(int newPriority) 设置线程的优先级
- public final int getPriority() 获取线程的优先级
- 线程的优先级1-10,默认为5
- 优先级更高,抢夺到cpu执行权的机率更高,但仅仅只是机率。
public class RunnableTest {
public static void main(String[] args) {
MyRunnable1 runnable1 = new MyRunnable1();
MyRunnable2 runnable2 = new MyRunnable2();
Thread thread1 = new Thread(runnable1);
Thread thread2 = new Thread(runnable2);
//设置线程优先级
thread1.setPriority(8);
thread2.setPriority(1);
//打印出线程一的优先级,不设置时默认为5
System.out.println(thread1.getPriority());
thread1.start();
thread2.start();
}
}
class MyRunnable1 implements Runnable {
@Override
public void run() {
while (true) {
try {
//线程休眠
Thread.sleep(800);
System.out.println(" ----First Thread----");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
class MyRunnable2 implements Runnable {
@Override
public void run() {
while (true) {
try {
//线程休眠
Thread.sleep(1500);
System.out.println(" ----Second Thread----");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
线程生命周期
- 企业网站架构之Nginx详解原理以及工作模块;源码Lnmp架构
- 【自然框架】——页面基类与设计模式(二) 模板模式
- HLS Lesson17-数组优化:数组映射和重组
- HLS Lesson16-数组优化:数组分割
- HLS Lesson15-for循环优化:其他方法
- 对自己的上网搜索记录进行爬虫是怎样一种体验
- HLS Lesson13-for循环优化:合并
- HLS Lesson12-for循环优化:基本性能指标
- HLS Lesson11-c/c++ testbench书写续2
- 【机器学习】实例详解机器学习如何解决问题
- 企业网站架构之Nginx+tomcat+memcached集群
- 企业级Docker Registry开源工具Harbor的介绍以及使用指南
- HLS Lesson8-基本操作
- Windows渗透测试工具:RedSnarf
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Spring Data Jpa 异常:PropertyReferenceException: No property xxx found for type for type yyy
- Spring全家桶之SpringData——SpringData Redis(附相关jar包)
- Spring全家桶之SpringBoot——初级阶段
- Spring全家桶之SpringBoot——高级阶段
- feign.FeignException$MethodNotAllowed: status 405 reading xxx#yyy(Integer)
- No serializer found for class 类名 and no properties discovered to create BeanSerializer
- 三步让你在Linux中发布SpringCloud项目
- 【赵渝强老师】MySQL高可用架构:MHA
- Python终极调试指南
- Spring全家桶之SpringCloud——高级阶段(上)
- go实现利用最大堆寻找最小k个数
- Go实现字符串相乘无溢出最详细解释
- 寻找和为定值的两个数
- 还不会命令行?用Go Flag自写命令行程序
- 【go】剑指offer:常见排序算法