线程基础

news/2024/10/13 4:18:49

生命周期

创建线程

class MyThread extends Thread{@Overridepublic void run(){ System.out.println("Hello World"); }
}class MyRunnable implements Runnable{@Overridepublic void run() { System.out.println("Hello World"); }
}public class Test1 {public static void main(String[] args) {// 匿名内部类new Thread(new Runnable() {@Overridepublic void run() {System.out.println("Hello World");}}).start();// Threadnew MyThread().start(); // Runnable Runnable myRunnable = new MyRunnable();Thread t1 = new Thread(myRunnable);Thread t2 = new Thread(myRunnable);t1.start();t2.start();}
}

常用方法

方法 作用 描述
Thread() 创建线程 构造方法,有不同的构造方法,能多种形式创建线程
start() 启动线程 jvm 自动调用 run 方法
run() 线程的主体方法,定义线程的执行逻辑 不需要手动调用,jvm 自动调用
setName(String) | getName() 设置和获取线程名称
join() | join(millis) 线程插队 在 a 线程的 run 方法中调用 b.join,那么 b 执行完才会执行 a
sleep(long millis) 线程休眠 让出 CPU ,不让出锁,时间到了再次抢夺 CPU(休眠期不会抢)
yield() 线程让步 让出 CPU ,不让出锁,可能让出 CPU 时间片后立马又被分配到了
currentThread() 获取当前线程

线程等待和唤醒

  1. wait:让出 cpu 时间片和 锁,程序走到这里立马暂停,既然要让处锁,所以必须先持有锁,所以必须用在 synchronized 中
  2. notify:唤醒正在等待 同一个锁 的线程,不是随便唤醒线程,而是等待同一个锁的线程,所以也必须用在 synchronized 中

notify 不会释放锁,要等到方法执行完才会释放锁

public class WaitNotifyExample {private final Object lock = new Object();private boolean condition = false;public void waitForCondition() throws InterruptedException {synchronized (lock) { while (!condition) { // synchronized 中的判断不能用 if 要用 whileSystem.out.println("让出 CPU 和锁.....");lock.wait(); // 等待条件为真}System.out.println("又抢到锁和分到 cpu 时间片...");}}public void setConditionTrue() {synchronized (lock) {condition = true;lock.notify(); // 唤醒一个等待线程(notify 不释放锁,但是这已是方法最后一行,方法结束会释放锁)// lock.notifyAll(); // 或者唤醒所有等待线程}}public static void main(String[] args) throws InterruptedException {WaitNotifyExample example = new WaitNotifyExample();Runnable waitTask = () -> {try {example.waitForCondition();} catch (InterruptedException e) {e.printStackTrace();}};Thread thread1 = new Thread(waitTask);thread1.start();Thread.sleep(2000); // 等待2秒钟// 在主线程中设置条件为true,唤醒等待线程example.setConditionTrue();}
}

线程安全 synchronized

  1. 同步方法
    1. 非静态同步方法,锁的是 this,调用哪个对象的同步方法,锁的就是谁
    2. 静态同步方法,锁的是类,全局唯一
  2. 同步块,可以指定锁对象,可以是一个对象,也可以是一个 Class,如果是 this ,和非静态同步方法一致,锁的是调用者
// 非静态同步方法
public synchronized void method(){}
a.method() // 锁的是 a// 静态同步方法
public synchronized static void method() {}
b.method() // 锁的是 method 所在的类// 同步代码块
public void method(){synchronized(this){} // 可以指定为某个对象或者 Class
}
c.method() // 锁的是 c

死锁

面试官:你告诉我什么是死锁我就录取你。候选人:你录取我我就告诉你什么是死锁

往往都是嵌套的 synchronized 导致

// 多运行几遍,如果效果不明显就两个线程获取第一把锁后分别 sleep 一会(两个线程获取的是不同的锁,第一次肯定都能获取)
public class DeadLockDemo {  // 两个锁private static String A="A";  private static String B="B";  public static void main(String[] args){  // 线程1new Thread(new Runnable(){  @Override  public void run(){  synchronized(A){  // 拿到 A 才进入synchronized(B){  // 拿到 B 才进入(这时要同时具有 A 和 B)System.out.println("AB");  }  }  }  });// 线程2new Thread(new Runnable(){  @Override  public void run(){  synchronized(B){ synchronized(A){  // 这时要同时具有 A 和 BSystem.out.println("BA");  }  }  }  });} 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/53178.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

网站提示413 Payload Too Large:请求实体过大怎么办

当遇到“413 Payload Too Large”错误时,这意味着客户端发送的请求实体(通常是请求体)超过了服务器允许的最大大小。这种错误通常出现在上传文件或发送大量数据时。 解决方案减小请求体大小检查请求体中的数据量是否过大。 如果是文件上传,考虑减小文件大小或压缩文件。增加…

网站提示500 - 服务器遇到了意外的错误,无法完成请求,可以刷新重试怎么办

当网站提示 500 Internal Server Error 时,这意味着服务器遇到了一个错误,无法完成请求。这种错误通常是由服务器端的问题引起的,可能是由于配置错误、脚本错误、数据库连接问题等。以下是解决 500 Internal Server Error 的一些常见方法: 常见原因服务器配置错误:服务器的…

网站提示5xx Server Errors(服务器错误状态码)怎么办

当遇到“5xx Server Errors”时,这意味着服务器在处理请求时遇到了错误,这些错误通常与服务器端的问题有关。5xx 系列的状态码包括但不限于:500 Internal Server Error:服务器遇到了一个未曾预料的状况,导致它无法完成对请求的处理。 501 Not Implemented:服务器不支持请…

网站提示451 Unavailable For Legal Reasons:因法律原因不可用怎么办

当遇到“451 Unavailable For Legal Reasons”错误时,这意味着服务器无法提供请求的内容,原因是出于法律原因。这种错误通常出现在内容受到版权保护、涉及敏感信息或其他法律限制的情况下。 解决方案检查内容合法性确认请求的内容是否涉及版权、隐私或其他法律问题。 如果内容…

网站提示503 Service Unavailable:服务器目前无法使用(由于超载或停机维护)怎么办

当遇到“503 Service Unavailable”错误时,这意味着服务器当前因为超载、维护或配置问题而无法处理请求。这种错误通常是因为服务器资源不足或正在进行维护操作。 解决方案刷新页面有时候简单地刷新页面就能解决问题。 服务器可能只是暂时无法响应请求。稍后再试如果服务器正在…

Datawhale AI 夏令营 第五期 CV方向 01

yolo方案baselinestep1:赛事报名 Datawhale (linklearner.com) 飞书文档 step2:跑通baseline首先在服务器下载代码apt install git-lfs git lfs install git clone https://www.modelscope.cn/datasets/Datawhale/AI_Camp5_baseline_CV.git学习下baseline的代码# 读取训练集视…

使用 SpanMetrics Connector 将 OpenTelemetry 跟踪转换为指标

原文:https://last9.io/blog/convert-opentelemetry-traces-to-metrics-using-spanconnector/如果您已经实施了跟踪但缺乏强大的指标功能怎么办? SpanConnector 是一个通过将跟踪数据转换为可操作指标来弥补这一差距的工具。这篇文章详细介绍了 SpanConnector 的工作原理,提…