首页 > 编程语言 >Java多线程-(线程的创建,线程安全,线程状态)

Java多线程-(线程的创建,线程安全,线程状态)

时间:2024-09-18 18:52:12浏览次数:3  
标签:Java Thread void 线程 new run 多线程 public

第一章.创建线程的方式

1.第一种方式_extends Thread

1.定义一个自定义线程类继承Thread
2.重写run方法(run方法是用于设置线程任务的)
3.创建自定义线程类对象
4.调用Thread类中的start方法(start方法:开启线程,jvm自动执行run方法)

public class MyThread extends Thread{
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println("MyThread...执行了"+i);
        }
    }
}
public class Test01 {
    public static void main(String[] args) {
        MyThread myThread = new MyThread();
        myThread.start();//开启线程,jvm自动执行run方法

        for (int i = 0; i < 10; i++) {
            System.out.println("Main线程...执行了"+i);
        }
    }
}

2.Thread类中的方法

void start() -> 开启线程,jvm自动调用run方法
void run()  -> 设置线程任务,这个run方法是Thread重写的接口Runnable中的run方法
String getName()  -> 获取线程名字
void setName(String name) -> 给线程设置名字
static Thread currentThread() -> 获取正在执行的线程对象(此方法在哪个线程中使用,获取的就是哪个线程对象)   
static void sleep(long millis)->线程睡眠,超时后自动醒来继续执行,传递的是毫秒值  

问题:为啥在main方法中处理异常可以throws,在run方法中处理异常不能throws,只能try?

Thread中的run方法没有抛异常,所以我们重写之后不能throws,只能try

void setPriority(int newPriority)   -> 设置线程优先级,优先级越高的线程,抢到CPU使用权的几率越大,但是不是每次都先抢到
int getPriority()  -> 获取线程优先级
void setDaemon(boolean on)  -> 设置为守护线程,当非守护线程执行完毕,守护线程就要结束,但是守护线程也不是立马结束,当非守护线程结束之后,系统会告诉守护线程人家结束了,你也结束吧,在告知的过程中,守护线程会执行,只不过执行到半路就结束了
static void yield() -> 礼让线程,让当前线程让出CPU使用权
void join() -> 插入线程或者叫做插队线程

3.第二种方式_实现Runnable接口

1.创建自定义线程类,实现Runnable接口
2.重写run方法,设置线程任务
3.利用Thread的有参构造:Thread(Runnable r),创建对象,传递自定义线程类对象
4.调用Thread中的start方法,开启线程

public class Test01 {
    public static void main(String[] args) {
        MyRunnable myRunnable = new MyRunnable();
        Thread t1 = new Thread(myRunnable, "赵四");
        Thread t2 = new Thread(myRunnable, "广坤");

        t1.start();
        t2.start();
    }
}
public class MyRunnable implements Runnable{
    @Override
    public void run() {
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName()+"...执行了"+i);
        }
    }
}

1.继承的方式是有局限性的,因为继承只支持单继承,不能多继承,如果使用继承的方式,这个自定义线程类还有其他的父类,此时就没办法再继承Thread了
    
2.实现的方式没有局限性,如果自定义线程类有父类,它可以直接继承一个父类的同时实现Runnable接口

4.匿名内部类创建多线程

 public static void main(String[] args) {
        /*
          Thread(Runnable r)
         */
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println(Thread.currentThread().getName()+"...执行了"+i);
                }
            }
        },"赵四").start();


        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 10; i++) {
                    System.out.println(Thread.currentThread().getName()+"...执行了"+i);
                }
            }
        },"刘能").start();
    }

第二章.线程安全

什么时候发生:当多个线程共同操作同一个资源时,会出现线程安全问题
出现的原因:CPU在多个线程之间做高速切换

1.解决线程安全问题的第一种方式(使用同步代码块)

1.格式:
  synchronized(锁对象){
      可能出现线程安全问题的代码 }

2.锁对象:任意对象
3.执行流程:
  线程抢到锁,去执行,其他线程必须在同步代码块中排队等待,等着执行的线程出了同步代码块,相当于释放锁了,其他排队等待的线程才能抢到锁去执行
4.注意:
  想要实现线程安全(线程同步),多个线程之间必须使用同一把锁

public class MyTicket implements Runnable{
    int ticket = 100;

    //创建一个对象,充当锁对象
    Object obj = new Object();

    @Override
    public void run() {
        while(true){
            try {
                Thread.sleep(100L);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            synchronized (obj){
                if (ticket>0){
                    System.out.println(Thread.currentThread().getName()+"...买了第"+ticket+"张票");
                    ticket--;
                }
            }

        }
    }
}
public class Test01 {
    public static void main(String[] args) {
        MyTicket myTicket = new MyTicket();
        Thread t1 = new Thread(myTicket, "赵四");
        Thread t2 = new Thread(myTicket, "刘能");
        Thread t3 = new Thread(myTicket, "广坤");

        t1.start();
        t2.start();
        t3.start();
    }
}

2.解决线程安全问题的第二种方式:同步方法

2.1.普通同步方法_非静态

1.格式:
  修饰符 synchronized 返回值类型 方法名(形参){
      方法体
      return 结果
  }

2.默认锁:this

 public  void method01(){
        synchronized(this){
            if (ticket>0){
                System.out.println(Thread.currentThread().getName()+"...买了第"+ticket+"张票");
                ticket--;
            }
        }

    }

2.2.静态同步方法

1.格式:
  修饰符 static synchronized 返回值类型 方法名(形参){
      方法体
      return 结果
  }

2.默认锁:当前类.class

public static  void method01(){
        synchronized(MyTicket.class){
            if (ticket>0){
                System.out.println(Thread.currentThread().getName()+"...买了第"+ticket+"张票");
                ticket--;
            }
        }

    }

死锁指的是两个或者两个以上的线程在执行的过程中由于竞争同步锁而产生的一种阻塞现象;如果没有外力的作用,他们将无法继续执行下去,这种情况称之为死锁

第三章.线程状态

当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,有几种状态呢?在API中java.lang.Thread.State这个枚举中给出了六种线程状态:

标签:Java,Thread,void,线程,new,run,多线程,public
From: https://blog.csdn.net/B___db_db/article/details/142217904

相关文章

  • 领导友好型数据展示:Java后端到可视化实战汇报
    舒一笑的网站:www.shuyixiao.cloud里面:面试八股文、BAT面试真题、工作内推、工作经验分享、技术专栏等等什么都有,欢迎收藏和转发。优化数据呈现:打造领导友好的数据库汇报方案在本次分享中,我将探讨一个完整的数据处理与可视化流程,旨在将复杂的系统日志信息转化为直观、易懂的图形展......
  • JavaSE——Java基础语法(黑马个人听课笔记)
    1.关键字介绍关键字:被Java赋予了特定含义的英文单词关键字的字母全部小写 常用的代码编辑器,针对关键字由特殊的颜色标记,非常直观2.常量2.1常量概述常量:在程序的执行过程中,其值不会发生改变的量(数据)  2.2常量的分类:字符串常量:被双引号包裹的内容整数常量:所......
  • [Java基础]集合的删除操作
    在Java中,直接在遍历集合时删除元素会引发ConcurrentModificationException,因为集合的结构在迭代过程中发生了变化。为了避免这种问题,可以使用Iterator或ListIterator来进行安全删除。下面介绍几种常见的方式。1.使用Iterator进行删除使用Iterator是在遍历集合时删除......
  • 基于springboot的就业信息管理系统。Javaee项目,springboot项目。
    演示视频:基于springboot的就业信息管理系统。Javaee项目,springboot项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Mybatis+Maven来实现,前端采用了layui框架。MySQL数据库作为系统数据储存平台,采用JDBC技术进行数据库连接,实现了基......
  • 基于SSM的抗疫物资管理系统(数据库表结构文档)。Javaee项目。
    演示视频基于SSM的抗疫物资管理系统(数据库表结构文档)。Javaee项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringMvc+Mybatis+Jsp+Bootstrap来实现。MySQL数据库作为系统数据储存平台,采用JDBC技术进行数据库连接,实现了基于B/S结构的Web系......
  • 基于SSM的美妆商城网站(有报告)。Javaee项目。
    演示视频:基于SSM的美妆商城网站(有报告)。Javaee项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringMvc+Mybatis+Jsp+Vue+layui+Elementui来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web系统。系统设计思想一个成......
  • Java JNA、JNI、ProcessBuilder、Runtime.getRuntime.exec()详解
    Java提供了几种方式与非Java代码进行交互(比如调用本地库或执行外部程序),其中包括JNA、JNI、ProcessBuilder和Runtime.getRuntime().exec()。下面是对每种方式的详细解释。1.JNA(JavaNativeAccess)简介JNA是Java与本地代码进行交互的一种高层次API,它允许Java......
  • java.lang.UnsatisfiedLinkError: dlopen failed: library "libc++_shared.so" not fo
    一、概述在AndroidStudio中集成opencv,使用其native函数时报的一个错误 二、解决办法opencv提供的native文件夹中提供的是动态库但是在gradle中的配置中,配置的stl是静态的,将其改为shared就行了externalNativeBuild{cmake{cp......
  • 准备好了吗?JAVA从业AI开发的学习路线详解
    作为一个拥有扎实Java基础的人,想要涉足人工智能(AI)应用开发,你已经在编程能力方面打下了很好的基础。Java是一种通用的、强类型的语言,非常适合于开发高性能的应用程序,尤其是在后端服务和大规模分布式系统方面。AI领域是一个高度跨学科的领域,涵盖了机器学习、深度学习、数据科学、......
  • 【他山之石】优化 JavaScript 的乐趣与价值(下)
    前言继本文的上篇发表之后,没想到反响还挺好,看来大家在JS优化的问题上越来越注重“与国际接轨”了。一起来看本文的下篇,也是干货满满。文章目录6.AvoidlargeobjectsWhattheeffshouldIdoaboutthis?7.Useeval8.Usestrings,carefullyWhattheeffs......