首页 > 编程语言 >Java多线程编程

Java多线程编程

时间:2024-07-04 10:58:18浏览次数:24  
标签:Java Thread 编程 class 线程 new 多线程 public

1. 进程

进程是指操作系统中正在运行的程序实例,它是系统资源分配的基本单位。每个进程都拥有独立的内存空间和系统资源,可以看作是程序的一次执行过程。

2. 线程

线程是进程中的执行单元,也被称为轻量级进程(Light Weight Process)。一个进程可以包含多个线程,这些线程共享进程的内存空间和资源,但拥有各自的栈空间和局部变量。线程是操作系统进行调度的基本单位,可以并发执行,实现多任务处理。

3. 多线程的优势

多线程编程可以带来以下优势:

  • 提高系统资源利用率:多线程可以充分利用多核处理器的能力,提高CPU资源的利用率,加快程序的执行速度。
  • 提高响应速度:通过多线程处理耗时操作,如网络请求、文件读写等IO操作,可以避免阻塞主线程,提升系统的响应速度和用户体验。
  • 简化程序结构:将不同任务分配给不同线程处理,可以简化程序设计,提高代码的清晰度和可维护性。

4. Java中的多线程实现方式

Java提供了多种方式来实现多线程,主要包括继承Thread类、实现Runnable接口和实现Callable接口(带返回值)三种方式。

4.1 继承Thread类

继承Thread类是实现多线程的一种简单方式,适合于线程类的逻辑与业务较为紧密的情况。

java复制代码// 定义一个继承Thread类的线程
public class MyThread extends Thread {
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println(Thread.currentThread().getName() + "~~~~~~~~~" + i);
        }
    }
}

// 在主程序中启动线程
public class TestThread {
    public static void main(String[] args) {
        MyThread my = new MyThread();
        my.start(); // 启动线程

        for (int i = 0; i < 20; i++) {
            System.out.println("main~~~~~~~~~~~~~" + i);
        }
    }
}

案例

请添加图片描述

public class SellTicket extends Thread {
    private int ticket=100;
    @Override
    public void run() {
       while (true){
           if(ticket>0){
               ticket--;
               System.out.println(Thread.currentThread().getName()+"卖了一张票,剩余:"+ticket+"张");
           }else{
               System.out.println(Thread.currentThread().getName()+"卖完了");
               break;
           }
       }
    }
}
public class TestTicket {
    public static void main(String[] args) {
        SellTicket task1=new SellTicket();
        SellTicket task2=new SellTicket();
        task1.setName("窗口1")
        task1.start();
        task2.setName("窗口2")
        task2.start();
    }
}

4.2 实现Runnable接口

实现Runnable接口是推荐的多线程实现方式,它将线程的任务逻辑与线程对象分离,提高了代码的灵活性和可复用性。

java复制代码// 定义一个实现Runnable接口的线程
public class MyRunnable implements Runnable {
    @Override
    public void run() {
        for (int i = 0; i < 20; i++) {
            System.out.println(Thread.currentThread().getName() + "~~~~~~~~~~~~~" + i);
        }
    }
}

// 在主程序中启动线程
public class TestRunnable {
    public static void main(String[] args) {
        MyRunnable my = new MyRunnable();
        Thread t = new Thread(my, "线程名");
        t.start(); // 启动线程

        for (int i = 0; i < 20; i++) {
            System.out.println("main+++++++++++++++++++" + i);
        }
    }
}

案例

请添加图片描述

public class SellTicket implements Runnable {
    private int ticket = 100;
    @Override
    public void run() {
        while (true) {
            if (ticket > 0) {
                try {
                    Thread.sleep(20);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                ticket--;
                System.out.println(Thread.currentThread().getName() + "卖了一张票;剩余:" + ticket + "张");
            } else {
                break;
            }
        }
    }
}
public class TestTicket {
    public static void main(String[] args) {
        SellTicket task=new SellTicket();

        Thread t1=new Thread(task,"窗口1");
        Thread t2=new Thread(task,"窗口2");
        Thread t3=new Thread(task,"窗口3");
        Thread t4=new Thread(task,"窗口4");

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

请添加图片描述

由结果发现: 会出现超卖和重卖现象。 这是因为多个线程共享一个资源,导致了线程安全隐患问题。后期解决线程安全问题。 后期我们可以使用锁解决。

继承Thread和实现Runnable的方式比较:使用实现Runnable比较好,因为Runnable是接口,扩展性更好

4.3 实现Callable接口

实现Callable接口允许线程执行有返回值的任务,并可以在任务完成后获取结果。

java复制代码// 实现Callable接口的线程,带有返回值
public class MyCallable implements Callable<Integer> {
    @Override
    public Integer call() throws Exception {
        int sum = 0;
        for (int i = 0; i <= 100; i++) {
            sum += i;
        }
        return sum;
    }
}

// 在主程序中启动线程并获取返回值
public class TestCallable {
    public static void main(String[] args) throws Exception {
        MyCallable my = new MyCallable();
        FutureTask<Integer> task = new FutureTask<>(my);
        Thread t = new Thread(task);
        t.start();

        Integer result = task.get(); // 获取线程执行的结果
        System.out.println("1到100的和为:" + result);
    }
}

Java中的多线程编程是提高程序性能和响应能力的重要手段。选择合适的多线程实现方式可以根据需求和场景灵活应对,同时需要注意线程安全和资源竞争的问题,使用同步机制和锁等手段确保多线程程序的稳定和正确性。

标签:Java,Thread,编程,class,线程,new,多线程,public
From: https://blog.csdn.net/m0_59933868/article/details/140173268

相关文章

  • java笔记分享(6)
    RandomRandom类        Random类位于java.util包下,Random类中实现的随机算法是伪随机,也就是有规则的随机。在进行随机时,随机算法的起源数字称为种子数(seed),在种子数的基础上进行一定的变换,从而产生需要的随机数字。        相同种子数的Random对象,相同次数......
  • 采用Java语言+开发工具 Idea+ scode数字化产科管理平台源码,产科管理新模式
    采用Java语言+开发工具Idea+scode数字化产科管理平台源码,产科管理新模式数字化产科管理系统是现代医疗信息化建设的重要组成部分,它利用现代信息技术手段,对孕产妇的孕期管理、分娩过程及产后康复等各个环节进行数字化、智能化管理,以提升医疗服务质量和效率;以下是对数字化......
  • 基于Java中的SSM框架实现野生动物公益保护系统项目【项目源码+论文说明】计算机毕业设
    基于Java中的SSM框架实现野生动物公益保护系统演示摘要本系统按照网站系统设计的基本流程,遵循系统开发生命周期法和结构化方法,基于Java语言设计并实现了野生动物公益保护系统。该系统基于浏览器/服务器模式,采用JSP技术,后台数据库系统选择MySQL数据库。系统分为前台和后台......
  • java 导出execl 文件实现动态列和列合并
    1.importorg.apache.poi.ss.usermodel.*;importorg.apache.poi.xssf.usermodel.XSSFWorkbook;第一步,判断有几列,放入list ,list一个一个判断,组装列 第二步,放数据的时候同样的逻辑,一列一列判断,放入数据  《2》实现列和行合并和列居中 4.main方法写到本地测试......
  • java高仿真数据生成器-需要的拿去
    java高仿真数据生成器源码-需要的拿去nit-random-tools介绍:高仿真数据生成器逆天开源java证号码,姓名,职业,日期,手机号生成器功能列表编号功能描述class1号生成器NitIdcardGenerator2姓名生成器NitChineseNameGenerator3职业生成器NitJobGenerator4日期生成器N......
  • Java程序员转到AI大模型开发的路线_java转ai
    从Java开发转向AI大模型开发,需要系统地学习和掌握一系列新的技术和算法。以下是一条推荐的学习路线:数学与统计学基础:线性代数:矩阵运算、特征值与特征向量等。概率论与统计学:概率分布、假设检验、最大似然估计、贝叶斯推断等。微积分:梯度求解和优化理论。机器学习入门:......
  • JAVA开发环境的搭建(JDK下载与安装)
    一、什么是JDK、JREJDK(JavaDevelopmentKit):是Java程序开发工具包,包含JRE和开发人员使用的工具。JRE(JavaRuntimeEnvironment):是Java程序的运行时环境,包含JVM和运行时所需要的核心类库。小结:        JDK=JRE+开发工具集(例如Javac编译工具等)        ......
  • java设计模式(十二)享元模式(Flyweight Pattern)
    1、模式介绍:        享元模式是一种结构型设计模式,旨在通过共享对象来有效支持大量细粒度的对象。它通过将对象的状态分为内部状态(可共享)和外部状态(不可共享)来减少内存消耗和提高性能。内部状态存储在享元对象内部,而外部状态则由客户端代码管理和传递。2、应用场景:......
  • 【Python函数编程实战】:从基础到进阶,打造代码复用利器
    文章目录......
  • 2024年华为OD机试真题- 分月饼-(C++/Java/python)-OD统一考试(C卷D卷)
      2024华为OD机试真题目录-(B卷C卷D卷)-【C++JavaPython】   题目描述中秋节,公司分月饼,m个员工,买了n个月饼,m≤n,每个员工至少分1个月饼,但可以分多个,单人分到最多月饼的个数是Max1,单人分到第二多月饼个数是Max2,Max1-Max2≤3,单人分到第n-1多月饼个......