Java线程创建(卖票),线程同步(卖包子)的实现示例

yizhihongxing

Java线程创建和线程同步是多线程编程必须掌握的核心知识点。下面将介绍Java线程创建和线程同步的实现示例。

Java线程创建的实现示例

Java线程创建通常有两种方式:继承Thread类和实现Runnable接口。

继承Thread类的实现示例

代码示例:

public class TicketSeller extends Thread {
    private static int tickets = 100; // 票数

    @Override
    public void run() {
        while (true) {
            synchronized (this) { // 加锁,确保线程安全
                if (tickets > 0) {
                    System.out.println(Thread.currentThread().getName() + "售出第" + tickets + "张票");
                    tickets--;
                } else {
                    System.out.println("票已售完");
                    break;
                }
            }
        }
    }
}

// 启动线程
public static void main(String[] args) {
    TicketSeller ts1 = new TicketSeller();
    TicketSeller ts2 = new TicketSeller();
    ts1.setName("窗口1");
    ts2.setName("窗口2");
    ts1.start();
    ts2.start();
}

说明:

  • TicketSeller类继承自Thread类,并重写了run()方法。在run()方法中,使用synchronized关键字加锁,确保线程安全。
  • main方法中,创建了两个线程ts1和ts2,并分别启动。通过setName()方法为线程命名,方便调试和排查线程问题。

实现Runnable接口的实现示例

代码示例:

public class TicketRunnable implements Runnable {
    private static int tickets = 100; // 票数

    @Override
    public void run() {
        while (true) {
            synchronized (this) { // 加锁,确保线程安全
                if (tickets > 0) {
                    System.out.println(Thread.currentThread().getName() + "售出第" + tickets + "张票");
                    tickets--;
                } else {
                    System.out.println("票已售完");
                    break;
                }
            }
        }
    }
}

// 启动线程
public static void main(String[] args) {
    TicketRunnable tr = new TicketRunnable();
    Thread ts1 = new Thread(tr);
    Thread ts2 = new Thread(tr);
    ts1.setName("窗口1");
    ts2.setName("窗口2");
    ts1.start();
    ts2.start();
}

说明:

  • TicketRunnable类实现了Runnable接口,并重写了run()方法。在run()方法中,使用synchronized关键字加锁,确保线程安全。
  • main方法中,创建了一个Runnable实例tr,并分别创建了两个线程ts1和ts2,并将tr作为参数传入Thread的构造函数中。通过setName()方法为线程命名,方便调试和排查线程问题。

线程同步的实现示例

线程同步是指多个线程对同一共享资源进行访问时,为了避免数据的不一致,需要采取措施防止每个线程间冲突。Java中可以通过synchronized关键字控制线程同步。

卖包子的实现示例

代码示例:

public class Baozi {
    private String type; // 包子类型
    private boolean hasBaozi; // 是否有包子

    public synchronized void produce(String type) { // 生产包子
        if (hasBaozi) { // 如果有包子,则等待
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("正在生产" + type + "包子");
        this.type = type;
        hasBaozi = true;
        notify(); // 生产成功,通知顾客
    }

    public synchronized String consume() { // 消费包子
        if (!hasBaozi) { // 如果没有包子,则等待
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("正在消费" + type + "包子");
        hasBaozi = false;
        notify(); // 消费成功,通知厨师
        return type;
    }
}

// 生产包子的线程
public class Producer implements Runnable {
    private Baozi baozi;

    public Producer(Baozi baozi) {
        this.baozi = baozi;
    }

    @Override
    public void run() {
        int count = 0;
        while (true) {
            if (count++ == 10) { // 生产10个包子后退出
                break;
            }
            baozi.produce("肉");
        }
    }
}

// 消费包子的线程
public class Consumer implements Runnable {
    private Baozi baozi;

    public Consumer(Baozi baozi) {
        this.baozi = baozi;
    }

    @Override
    public void run() {
        int count = 0;
        while (true) {
            if (count++ == 10) { // 消费10个包子后退出
                break;
            }
            baozi.consume();
        }
    }
}

// 启动线程
public static void main(String[] args) {
    Baozi baozi = new Baozi();
    new Thread(new Producer(baozi)).start();
    new Thread(new Consumer(baozi)).start();
}

说明:

  • Baozi类封装了包子的生产和消费方法。当还有包子时,生产线程进入等待状态,等待消费线程消费后通知;当没有包子时,消费线程进入等待状态,等待生产线程生产后通知。
  • Producer和Consumer类分别实现了Runnable接口,并在run()方法中调用Baozi的生产和消费方法,实现了多线程的操作。

以上就是Java线程创建和线程同步的实现示例的完整攻略。通过学习示例,掌握了多线程编程的核心知识点。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java线程创建(卖票),线程同步(卖包子)的实现示例 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 如何最大限度地降低多线程C#代码的复杂性

    如何最大限度地降低多线程C#代码的复杂性?下文将介绍三个主要的攻略。 1. 使用异步编程 使用异步编程是降低代码复杂性的一个非常重要的方法。尤其是在处理长时间运行的操作时,可以使用异步编程来避免阻塞主线程,同时可以提高程序的响应速度,让我们的程序更加高效。在使用异步编程时,我们需要使用 async 和 await 关键字。 以下代码演示了如何在不堵塞主线程的…

    多线程 2023年5月16日
    00
  • 详细分析java并发之volatile关键字

    详细分析java并发之volatile关键字 什么是volatile关键字? volatile是Java中的一个关键字,在多线程并发编程中用于标识一个变量是“易变”的。它的特殊之处在于,一个volatile变量的值在多线程环境下发生变化时,其他线程可以立即看到变化后的值,避免了线程之间的数据不一致。 volatile关键字的作用 在现代的CPU架构中,为了提…

    多线程 2023年5月17日
    00
  • Java多线程和并发基础面试题(问答形式)

    Java多线程和并发基础是Java程序员必须掌握的重要内容,而在面试中也会遇到不少关于多线程和并发的问题。下面我将为大家分享一份Java多线程和并发基础面试题攻略,来帮助大家更好地准备面试。 面试题列表 首先我们先列出本次面试准备涉及的问题列表: 线程和进程的区别是什么? 什么是线程安全?如何保证线程安全? synchronized、Lock和volatil…

    多线程 2023年5月16日
    00
  • 如何使用JCTools实现Java并发程序

    JCTools是一组相对较新的Java并发编程工具,提供了一些高性能的队列及其他并发数据结构,适合在高并发、低延迟的场景下使用。下面将详细讲解如何使用JCTools实现Java并发程序。 安装JCTools 使用Gradle或者Maven构建项目,添加以下依赖项即可使用JCTools: // Gradle compile group: "org.j…

    多线程 2023年5月17日
    00
  • C++详解多线程中的线程同步与互斥量

    C++详解多线程中的线程同步与互斥量 在多线程程序中,线程同步和互斥是很重要的概念。在不同的线程对同一共享变量进行读写时,如果没有合适的同步机制,就容易出现数据不一致的问题。因此,为了保证数据访问的正确性,我们通常会使用线程同步和互斥技术。 线程同步 线程同步是指协调不同线程之间的工作,以保证它们按照一定的顺序执行。通常情况下,我们会使用同步对象来实现线程同…

    多线程 2023年5月16日
    00
  • java线程池合理设置最大线程数和核心线程数方式

    下面是Java线程池合理设置最大线程数和核心线程数的完整攻略: 1. 什么是线程池以及为什么要使用线程池 线程池是一种多线程编程的技术,它可以通过复用已经创建好的线程来处理新的任务,从而降低线程实例的创建和销毁所带来的开销。使用线程池可以优化多线程应用程序的性能,防止在系统资源有限的情况下过度创建线程,导致系统性能下降,甚至崩溃。 2. 如何合理设置线程池的…

    多线程 2023年5月16日
    00
  • Python多线程编程之threading模块详解

    Python多线程编程之threading模块详解 什么是多线程编程 多线程编程是指在一个程序进程中同时运行多个不同的线程,这些线程可能会共享程序的内存空间和其他资源。在多线程编程中,有时需要将某一些任务放在不同的线程中运行,从而带来以下好处: 使程序可以同时执行多个任务,提高程序效率; 能够更加充分地利用计算机的CPU和其他资源; 在某些情况下,使用多线程…

    多线程 2023年5月16日
    00
  • Javaweb应用使用限流处理大量的并发请求详解

    Javaweb 应用使用限流处理大量的并发请求详解 在高并发情况下,大量的请求可能会造成服务器的宕机或响应延迟。为了解决这个问题,我们可以使用限流的方法来平滑控制请求的流量和数量。 什么是限流 限流是指在某种情况下控制流量或者节流保持并发线程的数量在合理的范围之内。在实际应用中,限流就是对某种资源或者连接、把它的使用量限制在一定范围内,防止由于某些原因导致的…

    多线程 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部