首页 > 编程语言 >Day19--Java多线程编程入门学习

Day19--Java多线程编程入门学习

时间:2024-08-06 22:52:35浏览次数:11  
标签:Java Thread -- void 线程 多线程 public

1. 什么是多线程?

多线程是一种并发编程技术,它允许程序同时执行多个线程。线程是程序执行的基本单位,一个程序至少有一个线程,即主线程。通过使用多线程,可以在一个程序中同时处理多个任务,提高程序的效率和响应能力。

2. 为什么要使用多线程?
  • 提升性能:在多核处理器上,多线程可以将任务分配到不同的核心上,充分利用硬件资源,提高程序的执行速度。
  • 增强响应性:在用户界面程序中,使用多线程可以使主线程继续响应用户操作,而后台线程处理耗时的任务,避免程序“卡顿”。
  • 任务分离:将复杂的任务分解成多个线程,可以使程序结构更清晰,便于维护和管理。
3. 如何在Java中使用多线程?

Java提供了两种主要的方式来创建线程:

  1. 继承Thread
    通过继承Thread类并重写run()方法来定义线程的执行逻辑。

    public class MyThread extends Thread {
        @Override
        public void run() {
            System.out.println("Thread is running");
        }
    
        public static void main(String[] args) {
            MyThread thread = new MyThread();
            thread.start(); // 启动线程
        }
    }
    

    在这个例子中,MyThread类继承了Thread类,并重写了run()方法。调用start()方法来启动线程,run()方法中的代码会在新线程中执行。

  2. 实现Runnable接口
    实现Runnable接口并将其作为参数传递给Thread构造函数。

    public class MyRunnable implements Runnable {
        @Override
        public void run() {
            System.out.println("Runnable thread is running");
        }
    
        public static void main(String[] args) {
            Thread thread = new Thread(new MyRunnable());
            thread.start(); // 启动线程
        }
    }
    

    这里,MyRunnable实现了Runnable接口,并重写了run()方法。然后创建Thread对象,将MyRunnable实例传递给构造函数,并调用start()方法启动线程。

4. 线程的生命周期

线程在Java中有以下几种状态:

  • 新建(New):线程对象创建后尚未调用start()方法。
  • 就绪(Runnable):线程调用了start()方法,但尚未获得CPU时间片。
  • 运行(Running):线程获得了CPU时间片并开始执行run()方法中的代码。
  • 阻塞(Blocked):线程在等待某些资源时被阻塞。
  • 等待(Waiting):线程处于无限期等待状态,直到被唤醒。
  • 超时等待(Timed Waiting):线程在等待指定时间后自动返回。
  • 终止(Terminated):线程执行完毕或因异常终止。
5. 线程同步

在多线程程序中,多个线程可能会访问共享资源,导致数据不一致。为了防止这种情况,Java提供了同步机制:

  • synchronized关键字:用于保证同一时刻只有一个线程可以访问被同步的代码块或方法。

    public class Counter {
        private int count = 0;
    
        public synchronized void increment() {
            count++;
        }
    
        public synchronized int getCount() {
            return count;
        }
    }
    

    在这个例子中,increment()getCount()方法被 synchronized修饰,确保在任何时候只有一个线程可以执行这些方法。

  • Lock接口:提供了比synchronized更灵活的同步机制。

    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class Counter {
        private int count = 0;
        private final Lock lock = new ReentrantLock();
    
        public void increment() {
            lock.lock();
            try {
                count++;
            } finally {
                lock.unlock();
            }
        }
    
        public int getCount() {
            lock.lock();
            try {
                return count;
            } finally {
                lock.unlock();
            }
        }
    }
    

    Lock接口提供了更多控制线程同步的功能,例如尝试获取锁或设置超时。

6. 线程的通信

线程之间可能需要协调工作。Java提供了以下方法来实现线程间通信:

  • wait():使当前线程等待,直到其他线程调用notify()notifyAll()方法。

  • notify():唤醒一个正在等待的线程。

  • notifyAll():唤醒所有等待的线程。

    public class SharedResource {
        private boolean available = false;
    
        public synchronized void waitForResource() throws InterruptedException {
            while (!available) {
                wait();
            }
            available = false;
        }
    
        public synchronized void releaseResource() {
            available = true;
            notify();
        }
    }
    

    在这个例子中,waitForResource()方法会使线程等待,直到availabletruereleaseResource()方法则会通知等待的线程资源已可用。

7. 总结

多线程编程是Java中一个强大的特性,它能够提高程序的性能和响应能力。了解如何创建和管理线程,以及如何处理线程同步和通信,是编写高效并发程序的关键。掌握这些基础知识后,你可以进一步学习更高级的并发工具和设计模式,如线程池、并发集合等。

标签:Java,Thread,--,void,线程,多线程,public
From: https://blog.csdn.net/github_49984491/article/details/140968203

相关文章

  • Day18_2--Vue.js Ajax(使用 Axios)基础入门学习
    Vue.js中的Ajax请求(使用Axios)什么是Axios?Axios是一个基于Promise的HTTP客户端,可以用于浏览器和Node.js环境中。它是现代化的Ajax库,用来替代传统的XMLHttpRequest。为什么选择Axios?简单易用:Axios提供了简洁且强大的API,使得发送HTTP请求变得非常简单......
  • 雷达气象学(7)——反射率因子图分析(气象回波篇)
    从本篇文章开始介绍反射率因子图(即雷达回波强度图)的分析与识别方法。目录7.0雷达回波的分类7.1层状云降水回波7.2积状云降水回波(对流性降水回波)7.3层积混合降水回波7.4零度层亮带7.5晴空回波7.0雷达回波的分类雷达回波可分为气象回波和非气象回波:\[雷达回波\begin{cas......
  • nuget离线安装
      nuget离线安装本地已经下载好的nuget包路径在:C:\Users\niunan.nuget\packagesVs中工具-->选项-->nuget包管理器-->程序包源,新建一个源,目录指向上面的就行了,这样就可以离线搜索索了,可以直接把上面的packages目录打包到其他电脑上应该也可行。。。或者离线状态下看本地的......
  • 从多个方面了解工作流自定义表单的优势
    进入流程化办公新时代,需要借助低代码技术平台、工作流自定义表单的诸多优势特点,打破信息孤岛,做好各部门之间的沟通协调工作,实现高效率发展。很多大中型企业都想了解工作流自定义表单究竟有什么样的优势和特点,现在,我们通过分析它的优势和特点,来进一步深入了解工作流自定义表单吧。......
  • Flink实战(10)-checkpoint容错保证
    0前言程序在Flink集群运行,某个算子因为某些原因出现故障,如何处理在故障恢复后,如何保证数据状态,和故障发生之前的数据状态一致?1什么是checkpoint(检查点)?Checkpoint能生成快照(Snapshot)。若Flink程序崩溃,重新运行程序时可以有选择地从这些快照进行恢复。Checkpoin......
  • (Jmeter新玩法)Python 调 Jmeter执行参数化jmx脚本
    #Python调Jmeter执行参数化jmx脚本importosfromos.pathimportjoinimporttimeimportrefromstringimportTemplatejmeter_Home=r"F:\softtotal\xxx\bin\jmeter.bat"#jmx文件路径currpath=os.path.dirname(os.path.realpath(__file__))#要运行的jmx脚......
  • 超快速的百度网盘不限速下载技巧,建议偷偷使用!
    小伙伴们,你们是否曾经为百度迅雷网盘限速而烦恼呢?动不动就要冲svip会员,不仅费钱,开通后还慢的气死,我现在来介绍一种全新的高效下载方法吧,只需要下载并安装一款神奇的软件,接着简单操作即可轻松实现快速下载,节省时间,这款神奇的软件具体信息在文章最后有说明。第一:你只需要将要下载的......
  • c#12 实验特性Interceptor如何使用的一个简单但完整的示例
    一直有很多转载dotnet对Interceptor说明文档的,但鲜有说明Interceptor如何使用的,这里写一篇简单示例来展示一下c#12实验特性Interceptor是什么?官方解释如下(其实简单说就是语言特性中内置的静态编织方式的aop功能,不同于其他il修改代码的方式,使用上得结合sourcegenerater来生......
  • 2024中山纪念暑假集训日记
    2024/8/6摆烂的一天上午专心打了一场模拟赛1h想出来T1,1h打,1h调,终于在本次集训中第一次切了一道题1h想T2,本来想到正解力,但急着打暴力,没管,最后暴力挂了,遗憾的中午快乐的看gyy和隔壁象棋大佬下棋,精彩!遗憾的就是gyy下的太慢了,马上就要输了然而却睡觉了,属于是一个急下午在写教主......
  • 矩阵相关
    矩阵相关\(Trick\)合集认知矩阵乘法的\(n\)种理解方式。定义式:\(C_{i,k}=\sumA_{i,j}\timesB_{k,j}\)$\times$满足交换律,结合律,\(+\)满足交换律,$\times$对\(+\)满足分配常见形式:\((+,\times),(\min,+),(\max,+),(|,\&)\)概念式:利用结合律对一个线性操作......