Java Thread

一、什么是Java Thread

Java Thread是指Java里的线程。线程是程序执行的一条路线,使得程序可以同时运行多个任务。与进程不同,线程在同一时间内只能有一个被执行,但是CPU可以在多条线程之间快速切换。Java线程是轻量级的,因为它们都是由线程控制器来管理的。

二、Java Thread的创建

Java Thread的创建有两种方式。第一种是继承Thread类,第二种是实现Runnable接口。

1、继承Thread类

    public class MyThread extends Thread{
        public void run(){
            //指定任务内容
        }
    }

创建线程实际上就是创建一个MyThread对象,而这个对象中的run()方法就是要执行的任务内容。调用start()方法后,线程就会被启动并执行run()方法。

2、实现Runnable接口

    public class MyRunnable implements Runnable{
        public void run(){
            //指定任务内容
        }
    }

创建线程时需要传入一个Runnable对象。Runnable对象中的run()方法就是要执行的任务内容。和继承Thread类不同,在实现Runnable接口时,一个对象可以被多个线程共享,从而达到线程共享数据的效果。

三、Java Thread的同步

在多线程执行的过程中,如果多个线程同时对同一个数据进行修改,就会出现数据不一致的问题。为了解决这个问题,就需要对线程进行同步。

1、synchronized关键字

synchronized关键字用于保护一个临界区,使得只能有一个线程进入临界区进行操作,其他线程则需要等待。synchronized关键字可以用在方法上或者代码块中,用法如下:

1.1、方法上锁
    public synchronized void doSomething(){
        //需要同步的代码
    }
1.2、代码块中锁
    public void doSomething(){
        synchronized(this){
            //需要同步的代码
        }
    }

2、volatile关键字

volatile关键字用于保证线程中变量的可见性。当一个变量声明为volatile时,在一个线程中对该变量的修改会马上被其他线程可见。在Java内存模型中,volatile变量可以被看作是一种比synchronized更轻量级的同步机制。用法如下:

    public volatile boolean flag = true;

四、Java Thread的状态

Java Thread一共有6种状态:新建状态、就绪状态、运行状态、阻塞状态、等待状态和死亡状态。

1、新建状态

线程创建后处于新建(New)状态。此时线程还没有被启动,也还没有分配到操作系统资源。这时线程已经进入了Java虚拟机的线程等待队列中。

2、就绪状态

当线程被启动后,进入了就绪(Runnable)状态。此时线程已经被分配到了操作系统资源,但它还没有取得CPU执行权。这时线程已经进入了Java虚拟机的线程就绪队列中。

3、运行状态

当线程获得了CPU执行权后,就处于运行(Running)状态。此时线程正在执行任务的代码。

4、阻塞状态

当线程调用了sleep()、wait()、join()等方法时,它进入了阻塞(Blocked)状态。在这种状态下,线程仍然占有操作系统分配的资源,但它不会执行任何代码,处于静止状态。只有当sleep()时间到、wait()条件满足或join()连接结束,阻塞状态的线程才会重新进入到就绪状态中。

5、等待状态

当线程调用了wait()、join()等方法后,并且没有指定等待时间,线程会进入等待(Waiting)状态,此状态下线程会释放它所占有的所有资源。线程只有在接收到notify()或notifyAll()消息后,才会重新进入到就绪状态中。

6、死亡状态

当线程的run()方法执行结束后,线程进入了死亡(Dead)状态。这个线程不能再重新启动,它的所有资源都会被释放。

五、Java Thread常用方法

Java Thread提供了一些非常常用的方法,我们可以根据需求来灵活运用。

1、start()方法

start()方法是真正启动一个线程的方法。当调用了start()方法后,线程就会开始执行,执行的内容是run()方法中的内容。

2、join()方法

join()方法使得调用该方法的线程优先执行,而其他线程等到该线程执行完成后再继续执行。

    public class MyThread extends Thread{
        public void run(){
            System.out.println("线程执行开始");
            try{
                Thread.sleep(5000);
            }catch(Exception e){

            }
            System.out.println("线程执行结束");
        }
    }

    public static void main(String[] args){
        MyThread myThread = new MyThread();
        myThread.start();
        try{
            myThread.join();
        }catch(Exception e){

        }
        System.out.println("主线程执行结束");
    }

以上代码将输出以下内容:

    线程执行开始
    线程执行结束
    主线程执行结束

3、yield()方法

yield()方法是暂停当前正在执行的线程对象,并执行其他线程。

    public static void main(String[] args){
        new Thread(){
            public void run(){
                System.out.println("线程1开始执行");
                Thread.yield();
                System.out.println("线程1结束执行");
            }
        }.start();

        new Thread(){
            public void run(){
                System.out.println("线程2开始执行");
                System.out.println("线程2结束执行");
            }
        }.start();
    }

以上代码将输出以下内容:

    线程1开始执行
    线程2开始执行
    线程2结束执行
    线程1结束执行

4、sleep()方法

sleep()方法使得调用该方法的线程暂停指定的时间,让其他线程有机会执行。

    public static void main(String[] args){
        new Thread(){
            public void run(){
                System.out.println("线程1开始执行");
                try{
                    Thread.sleep(5000);
                }catch(Exception e){

                }
                System.out.println("线程1结束执行");
            }
        }.start();

        new Thread(){
            public void run(){
                System.out.println("线程2开始执行");
                System.out.println("线程2结束执行");
            }
        }.start();
    }

以上代码将输出以下内容:

    线程1开始执行
    线程2开始执行
    线程2结束执行
    线程1结束执行

六、Java Thread的异常处理

线程在执行过程中可能会发生异常,为了保证线程能够正常运行,需要对线程执行代码进行异常处理。Java Thread的异常处理通常使用try-catch-finally语句。

    public static void main(String[] args){
        Thread thread = new Thread(){
            public void run(){
                try{
                    //需要执行的代码
                }catch(Exception e){
                    //异常处理的代码
                }finally{
                    //释放资源的代码
                }
            }
        };
    }

七、Java Thread的线程池

Java ThreadPoolExecutor是Java中线程池的实现。线程池是一种能够提高程序效率和稳定性的资源管理机制。在使用线程池的时候,一般需要指定线程数量和等待队列的长度。

    public static void main(String[] args){
        ExecutorService executorService = Executors.newFixedThreadPool(10);
        for(int i=0;i<100;i++){
            executorService.execute(new Runnable(){
                public void run(){
                    //执行代码
                }
            });
        }
        executorService.shutdown();
    }

八、总结

Java Thread是实现多线程的重要机制,在我们的日常开发中有着非常广泛的应用。本文从Java Thread的创建、同步、状态、常用方法、异常处理和线程池6个方面详细讲述了Java Thread的知识点,可以帮助读者更好地掌握Java Thread的使用方法。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/296231.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-27 12:58
下一篇 2024-12-27 12:58

相关推荐

  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29
  • VSCode为什么无法运行Java

    解答:VSCode无法运行Java是因为默认情况下,VSCode并没有集成Java运行环境,需要手动添加Java运行环境或安装相关插件才能实现Java代码的编写、调试和运行。 一、…

    编程 2025-04-29
  • Java任务下发回滚系统的设计与实现

    本文将介绍一个Java任务下发回滚系统的设计与实现。该系统可以用于执行复杂的任务,包括可回滚的任务,及时恢复任务失败前的状态。系统使用Java语言进行开发,可以支持多种类型的任务。…

    编程 2025-04-29
  • Java 8 Group By 会影响排序吗?

    是的,Java 8中的Group By会对排序产生影响。本文将从多个方面探讨Group By对排序的影响。 一、Group By的概述 Group By是SQL中的一种常见操作,它…

    编程 2025-04-29

发表回复

登录后才能评论