线程(2)

news/2024/10/5 8:01:02/文章来源:https://www.cnblogs.com/zyqq/p/18286925

1. Thread类中常用的一些方法

  • 线程休眠方法-static void sleep
public class MyThread extends Thread{@Overridepublic void run() {for (int i = 0; i <20 ; i++) {try {//秒杀---Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(Thread.currentThread().getName()+"~~~~~~~~~~~~~~~"+i);}}
}
  • yield 当前线程让出cpu-参与下次的竞争
public class MyThread extends Thread{@Overridepublic void run() {for (int i = 0; i <20 ; i++) {System.out.println(Thread.currentThread().getName()+"~~~~~~~~~~~~~~~"+i);Thread.yield();//当前线程让出cpu参与下次的竞争。System.out.println("~~~~~~~~~~~~~~~~");}}
}
  • join加入当前线程上
public class Test {public static void main(String[] args) throws InterruptedException {MyThread t1=new MyThread();t1.setName("线程A");MyThread2 t2=new MyThread2();t2.setName("线程B");t1.start();t2.start();t1.join(); //t1加入主线程上,主线程需要等t1执行完毕后才会执行. 如果主线程需要等带t1和t2线程的执行结果 做下一步操作时。for (int i = 0; i <20 ; i++) {Thread.sleep(10);System.out.println("main~~~~~~~~~~~~~~~~~~~~~"+i);}}
}
  • setDaemon()设置线程为守护线程
//JDK--默认就有一个守护线程.GC垃圾回收。
public class Test {public static void main(String[] args) throws InterruptedException {MyThread t1=new MyThread();t1.setName("线程A");t1.setDaemon(true);//设置t1为守护线程t1.start();for (int i = 0; i <20 ; i++) {System.out.println("main~~~~~~~~~~~~~~~~~~~~~"+i);}}
}

2. 解决线程安全问题

什么情况下会出现线程安全问题

当多个线程操作同一个资源时,则出现线程安全问题。

  • java如何解决线程安全问题

提供了两种方式:第一种:使用synchronized自动锁 第二种: 使用Lock手动锁。

使用锁相对于把原来的异步转换为同步操作。

  • 使用synchronized关键字解决

它可以使用在方法上,也可以使用在代码块中。
synchronized(共享锁对象){
同步代码块。

}

public class SellTicket implements Runnable {private int tick = 100;private static Object o = new Object();@Overridepublic void run() {while (true) {synchronized (this) {if (tick > 0) {try {Thread.sleep(20);} catch (InterruptedException e) {throw new RuntimeException(e);}tick--;System.out.println(Thread.currentThread().getName() + "卖了一张票;剩余:" + tick + "张");} else {break;}}}}
}
 public synchronized void sell(){if (tick > 0) {try {Thread.sleep(20);} catch (InterruptedException e) {throw new RuntimeException(e);}tick--;System.out.println(Thread.currentThread().getName() + "卖了一张票;剩余:" + tick + "张");}}
  • 使用Lock手动

Lock它是一个接口,它的实现类。ReentrantLock

public class SellTicket implements Runnable {private int tick = 100;private Lock l = new ReentrantLock();//synchronized使用在方法那么它的共享锁为this@Overridepublic void run() {while (true) {try {l.lock();//加锁if (tick > 0) {try {Thread.sleep(20);} catch (InterruptedException e) {throw new RuntimeException(e);}tick--;System.out.println(Thread.currentThread().getName() + "卖了一张票;剩余:" + tick + "张");} else {break;}} finally {l.unlock();//解锁}}}
}
  • synchronized和lock区别

synchronized可以使用代码块和方法。自动加锁和释放锁。不会出现死锁问题。

lock它只能使用在代码块中。需要手动加锁和释放锁。如果不释放锁,死锁问题。灵活。它的释放锁必须放在finally.

3. 死锁

线程A拥有锁资源a,希望获取锁资源b,线程B拥有锁资源b,希望获取锁资源a。 两个线程互相拥有对方希望获取的锁资源。可能会出现程序堵塞。从而造成死锁。

1. 不要使用锁嵌套。
2. 设置超时时间。--Lock类中tryLock.
3. 使用安全java.util.concurrent下的类。

4. 线程状态

    NEW,====新建状态。RUNNABLE,===>就绪状态和运行状态BLOCKED,===>堵塞状态WAITING,====>等待状态TIMED_WAITING,===>时间等待TERMINATED;===终止。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

陪玩app源码,加密算法中密钥生成和读取一览

陪玩app源码,加密算法中密钥生成和读取一览密钥生成与读取密码学随机数密码学随机数算法在安全场景中使用广泛,如:生成对称密钥、盐、iv等,因此相比普通的随机数算法(如线性同余),它需要更高强度的不可预测性,在Java中,使用SecureRandom来生成更安全的随机数,如下:pub…

陪玩小程序源码,不容错过的加密算法整理清单

陪玩小程序源码,不容错过的加密算法整理清单在开发陪玩小程序源码时,可采用的加密算法类型包含:对称加密对称加密算法,使用Cipher类即可,以广泛使用的AES为例,如下:public byte[] encrypt(byte[] data, Key key) {try {Cipher cipher = Cipher.getInstance("AES/CB…

【QT】工程库引用

创建多工程项目创建子项目UI窗体项目创建库工程项目引用库工程添加日志输出类5.1 需要添加特殊配置,否则编译会报错5.2 正确添加配置5.3 日志正常输出5.4 如果缺少5.1步骤,则报如下错误5.5 如果添加了5.1步骤,还是报The process was ended forcefully 找到项目文件,把debug…

陪玩系统源码,为守护系统安全增添更多助力

陪玩系统源码,为守护系统安全增添更多助力在开发陪玩系统源码时,可以通过加密、解密算法来提升系统的安全性,比较常见的加密、解密算法类型有:1、对称加密:速度快,可逆,常见DES,AES等2、非对称加密:速度慢,可逆,常见RSA等3、签名算法:唯一,不可逆,常见MD5,SHA,…

pycharm创建临时文件scatch file

JetBrains PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外,该IDE提供了一些高级功能,以用于Django框架下的专业Web开发。 有时您可能需要创建临时注释或在项目上下文之外起草一些代码。为此,您可以使用临时文件和临时缓冲…

P5441

P5441 神仙题目。 tips:后面把 \(4\) 个点说成一个组。我们先考虑一个组怎么连才不是强联通的。一个点 A 向另外三个点 BCD 连一条有向边。在不满足第一种的情况下,BCD 向另一个点 A 连一条有向边。AB 之间连有向边,CD 之间连无向边,然后 AC 和 AD 连一条有向边,BC 和 BD …

二水中分白鹭洲

二水中分白鹭洲 题目大意 假设水中 \(n\) 条体积相等的鱼将按顺序依次排列,准备进行战斗。初始时,每条鱼可以选择向左游或向右游;但是鱼儿不太聪明,它们只会随机选择初始方向。 战斗时,若两条不同方向的鱼相遇,则体积大的鱼会吃掉体积小的鱼;如果两条鱼的体积相同,则向…

git恢复到之前提交的记录

项目搞崩了,还提交上去了怎么办? 那当然是恢复到之前的提交记录了,那怎么操作呢? 首先,到代码托管平台找到你想恢复的提交记录(在此以github为例) 获取 commit id 首先,通过如下图操作获取到commit id {% asset_img image-20240706062921362.png "..." "…

[python]Markdown图片引用格式批处理桌面应用程序

需求 使用python编写一个exe,实现批量修改图片引用,将修改后的文件生成为 文件名_blog.md。有一个编辑框,允许接收拖动过来md文件,拖入文件时获取文件路径,有一个编辑框编辑修改后的文件的输出路径,用户拖入文件时,就能自动得到输出的路径 作用是将md文件中的例如 ![ima…

读人工智能全传04NP完全问题

读人工智能全传04NP完全问题1. 问题解决与搜索 1.1. 解决问题的能力无疑是区分人类和其他动物的关键能力之一 1.1.1. 解决问题是需要智慧的 1.2. 汉诺塔 1.2.1. 对于三个金环而言 1.2.1.1. 你不可能找到少于7次的解决方案了 1.2.2. 最初,我们只能选择移动最小的金环,只有将它…

sunny 拦截不成功解决

可能开了tz,导致无法拦截请求 解决方法:打开这个注释本文来自博客园,作者:__username,转载请注明原文链接:https://www.cnblogs.com/code3/p/18286840

02.内建变量类型

内建变量类型bool,string(u)int,(u)int8,(u)int16,(u)int32,(u)int64,uintptr 无长度 int 的实际长度取决于操作系统位数(32/64)uintptr 为指针类型byte,rune rune 为 Go 语言的字符型相当于其他语言的 char ,长度为4字节 int32float32,float32,complex64,complex128 complex …