多线程访问堆栈问题

假设堆栈的大小为3,堆栈中最多仅能存放3个元素。有两个线程分别对堆栈进行连续的读写操作。其中一个线程进行连续的写操作(压栈);另一个线程进行连续的读操作(出栈)。在连续读写栈的同时,要保证当栈空的时候不能进行读(出栈)操作;当栈满的时候不能进行写(压栈)操作,否则会出现栈的操作异常。如栈满了还进行写操作会产生栈的溢出异常;栈空了还进行读操作会产生空引用异常。为了保证能够顺利安全的对栈进行读写操作,需要两个线程进行同步处理。

试分别创建读写线程对堆栈进行连续的20次操作,保证读写操作有序进行且不会产生异常。

思路

每次写线程写入3个数后阻塞,等待读线程读出3个数后继续运行。
为了保证读写线程在对栈进行读写时不会产生冲突,对栈操作时应使用synchronized关键字对栈加锁,同一时刻只能有一个线程对栈进行读或写的操作。

运行结果:
在这里插入图片描述

主程序

import java.util.Stack;
public class Main {
    public static void main(String[] args) {
        Stack<Integer> Stack = new Stack< >();
        Stack.setSize(3);
        Stack.removeAllElements();
        //创建写线程
        Thread writeThread = new Thread(new WriteStack(Stack));
        writeThread.setName("WriteThread");
        //创建读线程
        Thread readThread = new Thread(new ReadStack(Stack));
        readThread.setName("ReadThread");
        //启动读写线程
        writeThread.start();
        readThread.start();
    }
}

压栈程序

import java.util.Stack;
public class WriteStack implements Runnable {
    Stack<Integer> Stack;
    int count = 1;
    public WriteStack(Stack<Integer> Stack) {
        this.Stack = Stack;
    }
    public void run() {
        while (count <=20) {
            synchronized (Stack) {
                if (Stack.size() == 3) {
                    try {
                        Stack.wait();
                    } catch (InterruptedException e) {
                        System.out.println(e.getMessage());
                    }
                }
                System.out.println("子线程" + Thread.currentThread().getName() + "写数据:" + Stack.push(count));
                count++;
                if (Stack.size() == 3 || count == 20) {
                    Stack.notify();
                }
            }
        }
    }
}

出栈程序

import java.util.Stack;
public class ReadStack implements Runnable {
    Stack<Integer> Stack;
    int count = 1;
    public ReadStack(Stack<Integer> Stack) {
        this.Stack = Stack;
    }
    public void run() {
        while (count <= 20) {
            synchronized (Stack) {
                if (Stack.empty()) {
                    try {
                        Stack.wait();
                    } catch (InterruptedException e) {
                        System.out.println(e.getMessage());
                    }
                }
                System.out.println("子线程" + Thread.currentThread().getName() + "读数据:" + Stack.pop());
                count++;
                Stack.notify();
            }
        }
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我来详细解释一下多线程。 在一个程序中,通常会有多个任务需要同时执行,而且有些任务可能需要很长的时间才能完成。如果所有的任务都在一个线程中执行,就会现程序“卡住”的情况,即程序处于一种等待状态,无法响应用户的操作,用户体验非常差。为了解决这个问题,就需要使用多线程技术。 多线程是指在一个程序中同时运行多个线程,每个线程都可以独立执行不同的任务。每个线程都有自己的堆栈、局部变量和程序计数器等线程私有的资源,但是它们共享进程的其他资源,比如全局变量和静态变量等。多线程可以让程序更加高效,能够同时处理多个任务,提高系统的响应速度和并发能力。 在 C# 中,可以使用 System.Threading 命名空间中的 Thread 类来创建和管理线程。下面是使用 Thread 类创建和启动一个线程的示例代码: ``` using System; using System.Threading; public class Program { public static void Main() { Thread t = new Thread(new ThreadStart(DoWork)); t.Start(); } public static void DoWork() { // 线程要执行的任务 } } ``` 上面的代码中,我们创建了一个名为 t 的线程,并将其启动。线程要执行的任务定义在 DoWork 方法中。 在多线程编程中,需要注意线程之间的同步问题,以避免现数据竞争和死锁等问题。比如,多个线程可能同时访问同一个共享变量,如果不加以控制,就会现数据竞争的问题。C# 中提供了多种线程同步机制,比如 lock、Monitor、Semaphore 等,可以用来保护共享资源,避免数据竞争问题的发生。 此外,多线程还有一些常见的问题,比如线程池的使用、线程的优先级、线程的异常处理等等。需要开发人员了解和掌握这些知识,才能写可靠、高效的多线程程序。 总之,多线程是一种非常重要的编程技术,可以提高程序的效率和性能,但是也需要开发人员具备一定的编程经验和技能,才能正确地使用它。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沐雨风栉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值