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

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线程创建和线程同步的实现示例的完整攻略。通过学习示例,掌握了多线程编程的核心知识点。

阅读剩余 74%

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

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

相关文章

  • java多线程join()方法的作用和实现原理解析(应用场景)

    java多线程join()方法的作用和实现原理解析 作用 在Java多线程编程中,有时候需要等待一个线程完成后再去执行其他任务。这时候就需要用到join()方法。join()方法会阻塞当前线程,等待被调用线程执行完成后再继续执行。 实现原理 当调用join()方法时,调用线程会进入等待状态,等待被调用线程执行完成。在Thread的join()方法内部,会调用…

    多线程 2023年5月17日
    00
  • iOS中多网络请求的线程安全详解

    iOS中多网络请求的线程安全详解 背景 在iOS开发中,常常需要进行多个网络请求,这些网络请求有时需要同时进行,有时需要按照一定顺序进行,还有的情况则是必须等待前一个网络请求完成后才能进行下一个网络请求。面对这些情况,我们必须注意多线程编程中线程安全的问题。 线程安全问题 线程安全问题是多线程编程中必须注意的一个问题。多线程环境下,用于处理网络请求的对象和方…

    多线程 2023年5月17日
    00
  • java并发使用CountDownLatch在生产环境翻车剖析

    Java并发使用CountDownLatch在生产环境翻车剖析攻略 什么是CountDownLatch CountDownLatch 是 java.util.concurrent 包下的一个同步工具类,它可以让一个线程等待一组事件的发生后再继续执行。 CountDownLatch 提供了两个方法: countDown():计数器减一 await():等待计数…

    多线程 2023年5月17日
    00
  • Java多线程继承Thread类详解第1/2页

    让我来详细讲解一下关于“Java多线程继承Thread类详解”的攻略。 标题 Java多线程继承Thread类详解第1/2页 概述 在Java中,多线程编程是经常用到的技术。其中,继承Thread类是一种创建多线程的方式。本文将详细讲解继承Thread类的实现方法和相关知识点。 继承Thread类的实现方法 Java中实现多线程有两种方式,分别是继承Thre…

    多线程 2023年5月17日
    00
  • Thread线程的基础知识及常见疑惑点总结

    下面是关于”Thread线程的基础知识及常见疑惑点总结”的完整攻略,包括定义、使用方法、常见疑惑点等。 1. Thread线程的定义 线程是程序中一个单一的顺序执行路径,程序中有多个线程共同执行,每个线程都有自己的任务,所有线程都共享同一块内存空间。 简单来说,线程就是在单个程序中同时运行多项任务的方式,最终完成程序的所有任务。 2. Thread线程的使用…

    多线程 2023年5月16日
    00
  • Java详解多线程协作作业之信号同步

    Java详解多线程协作作业之信号同步 在多线程协作时,信号同步是一种重要的协作机制。它可以让线程等待某个条件满足后再继续执行,从而实现线程之间的协作。本篇文章将详细讲解Java中信号同步的用法和原理。 使用等待/通知机制实现信号同步 Java中使用等待/通知机制来实现信号同步。该机制由以下三个方法实现: wait():使线程等待,直到其他线程调用了notif…

    多线程 2023年5月16日
    00
  • Java并发之嵌套管程锁死详解

    Java并发之嵌套管程锁死详解 简介 Java 并发编程中的管程(Monitor)是实现并发编程的常见方式,该技术利用了锁、条件变量等概念来协调多个线程间的执行。然而,嵌套的管程锁死却是烦扰Java并发编程的一大难题。本文将详细讲解嵌套管程锁死的原因、如何解决及相关实例说明。 嵌套管程锁死原因 管程中的锁是互斥锁,当一个线程获取了管程上的锁,其他线程就无法访…

    多线程 2023年5月16日
    00
  • Go并发:使用sync.WaitGroup实现协程同步方式

    下面详细讲解如何使用sync.WaitGroup实现协程同步的完整攻略。 什么是协程同步? 在使用协程进行并发编程时,我们常常需要等待所有协程都执行完毕后再进行某些操作,这时候我们就需要协程同步。协程同步指的是在并发编程中,协调多个协程的执行顺序,确保它们可以在特定的时间点同步。 WaitGroup的使用 WaitGroup是Go语言中提供的一种机制,它可以…

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