首页 > 其他分享 >线程中的一些常用方法 和线程安全问题

线程中的一些常用方法 和线程安全问题

时间:2024-07-06 09:55:12浏览次数:13  
标签:常用 void t1 安全 线程 new tick public

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

1.1线程休眠方法 static void sleep

public class MyThread extends Thread{

    @Override
    public 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);
        }
    }
}
1.2yield 当前线程让出cup 参与下次竞争
public class MyThread extends Thread{

    @Override
    public void run() {
        for (int i = 0; i <20 ; i++) {
            System.out.println(Thread.currentThread().getName()+"~~~~~~~~~~~~~~~"+i);
            Thread.yield();//当前线程让出cpu参与下次的竞争。
            System.out.println("~~~~~~~~~~~~~~~~");
        }
    }
}
1.3join加入当前线程上

插入线程执行完毕后,当前线程才会执行


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);
        }
    }
}
1.4 setDaemon()设置线程为守护线程

当线程执行完毕后守护线程也会终止

>

```java
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);
        }
    }
}
```

## 3.线程

2.线程的安全问题

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

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

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

提供了两种方式,
第一种:使用synchronized自动锁
第二种:使用Lock手动锁.
使用synchronized关键字解决

它可以使用在方法上也可以使用在代码块中

<br class="Apple-interchange-newline"><div></div>

synchronized(共享锁对象){
同步代码块。

}

public class SellTicket implements Runnable {
    private int tick = 100;
    private static Object o = new Object();

    @Override
    public 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;
                }
            }
        }
    }
}
使用Lock手动

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


public class SellTicket implements Runnable {
    private int tick = 100;

    private Lock l = new ReentrantLock();

    //synchronized使用在方法那么它的共享锁为this
    @Override
    public 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();//解锁
            }

        }
    }


}

标签:常用,void,t1,安全,线程,new,tick,public
From: https://blog.csdn.net/2301_79142355/article/details/140224491

相关文章

  • 线程(2)
    1.Thread类中常用的一些方法线程休眠方法-staticvoidsleeppublicclassMyThreadextendsThread{@Overridepublicvoidrun(){for(inti=0;i<20;i++){try{//秒杀---Thread.sleep(1000);......
  • 项目中安全地管理配置文件中的敏感信息
    原文:在SpringBoot应用开发中,我们常常将数据库密码、API密钥等敏感信息存储在配置文件中,方便应用读取和使用。然而,将这些敏感信息以明文形式直接写在配置文件中,会带来极大的安全风险。本文将为你详细介绍如何在SpringBoot项目中保护好配置文件中的敏感信息。❞为什么要......
  • 学习笔记——交通安全分析11
    目录前言当天学习笔记整理4信控交叉口交通安全分析结束语 前言#随着上一轮SPSS学习完成之后,本人又开始了新教材《交通安全分析》的学习#整理过程不易,喜欢UP就点个免费的关注趴#本期内容接上一期10笔记#最近确实太懒了,接受宝子们的批评,以后我会注意哒,虽然每天都有学......
  • 陪玩系统源码,为守护系统安全增添更多助力
    陪玩系统源码,为守护系统安全增添更多助力在开发陪玩系统源码时,可以通过加密、解密算法来提升系统的安全性,比较常见的加密、解密算法类型有:1、对称加密:速度快,可逆,常见DES,AES等2、非对称加密:速度慢,可逆,常见RSA等3、签名算法:唯一,不可逆,常见MD5,SHA,SHA256等安全数据传输方案......
  • 多线程一
    线程启动线程生命周期阻塞状态分为Blocked,time-waiting.外在表现区别不大,产生的原因不同,可以通过jstack查看,更具体的状态有助于我们排查线程相关问题。下面这个时更为详细的生命周期图线程停止stop方法:不建议使用,类似于kill-9,不够优雅interrupt():通过Thread.current......
  • 常用的SQL语句
    这里只记录了常用的一些SQL语法。1、数据查询//基础查询SELECTcolumn1,column2FROMtable_name;//查询所有列SELECT*FROMtable_name;//带条件的查询SELECTcolumn1,column2FROMtable_nameWHEREcondition;//去重查询SELECTDISTINCTcolumn_nameFROMtable......
  • Linux系统的基础知识和常用命令
    1、什么是Linux?是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布,它主要受到Minix和Unix思想的启发,是一个基于POSIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的Unix工具软件、应用程序和网络协议。......
  • Halcon 学习笔记(1):常用套路和算子
    目录前言套路常用算子图形色相消息Region处理特征值逻辑前言这里总结常用算子和套路套路预处理:设置图片大小,RGB通道设置找到Region,特征值分割:形状:球,正方形,椭圆,长方形面积:亮度:滤波,过滤不需要的图像输出结果常用算子图形read_image:得到imagedev_open_windowde......
  • #cmd的常用命令(Dos)
    cmd的常用命令首先win+r输入cmd并回车进入cmd命令中cd命令:进入指定目录cdd:进入d盘目录.会发现进入不了d盘,因为cd只能在当前目录下操作不能跨区操作.键入d:回车进入d盘.我d盘下有aaa文件夹cdaaa进入文件夹aaa目录下提示".."为上一级目录."."为当前目录cd......
  • Springboot+Shiro+Mybatis+mysql实现权限安全认证
    Shiro是Apache的一个强大且易用的Java安全框架,执行身份验证、授权、密码学和会话管理。Shiro主要分为两个部分就是认证和授权两部分一、介绍Subject代表了当前用户的安全操作SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通过SecurityManager来管理内部组......