`
atell
  • 浏览: 161675 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

线程交替运行,一个写,一个读。

阅读更多
import java.util.Stack;

public class SynchronizedTest {

    public static void main(String[] args) {
        Stack<String> s = new Stack<String>();
        Thread t1 = new Producer(s);
        t1.start();
        Thread t2 = new Consumer(s);
        t2.start();
    }

}

class Consumer extends Thread {

    Stack<String> s;

    public Consumer(Stack<String> s) {
        this.s = s;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (s) {
                while (s.empty()) {
                    try {
                        s.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("pop:" + s.pop());
                s.notify();
            }
        }
    }

}

class Producer extends Thread {
    Stack<String> s;

    public Producer(Stack<String> s) {
        this.s = s;
    }

    @Override
    public void run() {
        while (true) {
            synchronized (s) {
                while (!s.empty()) {
                    try {
                        s.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println("push:" + s.push("a"));
                s.notify();
            }
        }
    }

}

 输出:

push:a
pop:a
push:a
pop:a

......

 

或者:

import java.util.Stack;

public class SynchronizedTest {

    public static void main(String[] args) {
        Data data = new Data();
        Thread t1 = new Producer(data);
        t1.start();
        Thread t2 = new Consumer(data);
        t2.start();
    }

}

class Data {
    Stack<String> s = new Stack<String>();

    public synchronized void read() {
        while (s.empty()) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("pop:" + s.pop());
        notify();
    }

    public synchronized void write() {
        while (!s.empty()) {
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("push:" + s.push("a"));
        notify();
    }
}

class Consumer extends Thread {

    Data data;

    public Consumer(Data data) {
        this.data = data;
    }

    @Override
    public void run() {
        while (true) {
            data.read();
        }
    }

}

class Producer extends Thread {
    Data data;

    public Producer(Data data) {
        this.data = data;
    }

    @Override
    public void run() {
        while (true) {
            data.write();
        }
    }

}
 
分享到:
评论

相关推荐

    Linux系统编程之线程同步

    线程同步,指一个线程发出某一功能调用时,在没有得到结果之前,该调用不返回。同时其它线程为保证数据一致性,不能调用该功能。 举例1: 银行存款 5000。柜台,折:取3000;提款机,卡:取 3000。剩余:2000 举例2...

    多线程模型

    在一个程序中,可以创建多个线程,每个线程都有自己的执行路径,可以在不同时间片上交替运行,从而提高了程序的执行效率。在数据库应用中,尤其是大数据量或高并发场景下,多线程模型能够显著提升数据读取的速度。 ...

    进程同步读者写者问题

    进程同步的读者写者问题是多线程编程中的一个经典问题,它主要涉及到多个读者和一个写者对共享资源的访问控制。在这个问题中,多个读者可以同时读取资源,但只有一个写者能写入资源,而且写者写入时不能有其他读者或...

    第10章 多线程.docx

    - **CopyOnWriteArrayList**:线程安全的动态数组,读操作无锁,写操作复制原数组创建新数组,适合读多写少的场景。 - **CopyOnWriteArraySet**:基于CopyOnWriteArrayList的线程安全集合,适用于对集合进行迭代时...

    第2章 进程与线程修改

    在单道程序系统中,每次只有一个程序在内存中运行,程序的执行严格按照顺序,即一个操作完成后才能执行下一个操作。这种顺序执行方式虽然简化了程序员的调试工作,但由于资源的独占,导致系统资源利用率较低。 为了...

    读者写者问题,操作系统课程设计.pdf

    读者-写者锁的概念在此处至关重要,它允许读锁(允许多个读者)和写锁(仅允许一个写者)。当读者获得读锁时,写者无法访问资源;反之,当写者获取写锁时,所有其他读写操作都会被阻止。 在这个课程设计中,学生...

    Java并发编程面试题合集

    yield()方法是一个静态方法,它向线程调度器表示当前线程愿意放弃当前CPU的使用,调度器可以运行其他线程。yield()方法不会使当前线程终止,而是回到就绪状态。 ThreadLocal变量提供了一种方式,使得线程能够拥有...

    js代码-实现类似与java的多线程打印 实现交替打印1a2b3c4

    - 使用async/await可以使代码更易读,因为它们可以让我们写出更接近同步的代码。 - 可以定义两个或多个异步函数,每个函数内部使用await关键字等待一个Promise完成。通过交替调用这些函数,可以实现交替打印。 5....

    android安卓app开发教程之--总结了50条安卓开发经验.zip

    (123代表不同线程,轮流插入一个记录),读和写均不会锁住db,读写交替并没有规律,执行次数和程度看cpu分配给哪个线程的时间片长 43. 选择正确的集合类型使你能够在集合性能与内存占用之间达到合理的平衡。除此...

    读者写者问题,操作系统课程设计报告书.doc

    任务包括设计并实现一个读写器程序,其中包含读者线程和写者线程,使用适当的同步机制(如信号量)来协调它们对共享资源的访问。要求程序能够正确处理多读者同时读、单个写者独占写以及读写互斥的情况。 1.3 课程...

    JAVA并发编程实践

    - `ReentrantReadWriteLock`:读写锁,允许多个读操作同时进行,但不允许读和写同时进行,也不允许两个写操作同时进行。 ##### 2.4 线程间通信 - **wait()、notify()和notifyAll()**:这三个方法是`Object`类提供...

    并发编程面试题(2020最新版)

    并发编程是当今软件开发中不可或缺的一部分,尤其是在多核处理器日益普及的背景下,合理地使用并发编程能够显著...读写锁ReentrantReadWriteLock允许多个读线程同时访问,而在写线程访问时,读线程和写线程都会被阻塞。

    java 上机题

    第8题的最后一个题目中,一个线程写数据,一个线程读数据,可能需要使用synchronized关键字或Lock接口来实现同步。 通过这些题目,学生可以深入理解Java的基础语法、面向对象编程、异常处理、文件I/O以及并发编程等...

    Java基础学习59.pdf

    在单核CPU中,实现并发的方式是通过时间分片来快速交替执行多个线程,即所谓的并发;而在多核CPU中,可以实现真正的并行,多个线程可以在不同的处理器上同时执行。 二、多线程编程基础 Java语言提供了内置支持来...

    Python解决哲学家就餐问题-内含源码以及设计说明书(可以自己运行复现).zip

    这个经典的问题是计算机科学中的一个同步问题示例,它源于逻辑学家和数学家图灵奖得主Edsger Dijkstra提出的一个思想实验。在这个问题中,五位哲学家围坐在一张圆桌旁,每人面前有一只筷子。当哲学家想吃饭时,他...

    python gevent==21.8.0

    而Gevent通过使用greenlet(一种轻量级的线程实现)来调度执行,使得多个任务可以在同一个线程中交替运行,提高了系统资源的利用率。 Odoo是另一个与Gevent关联的重要概念。Odoo是一个开源的企业资源规划(ERP)...

    【面试资料】-(机构内训资料)Java并发面试题.zip

    - **synchronized**:提供互斥访问,保证同一时刻只有一个线程访问特定代码块。 3. **线程同步机制** - **锁**:包括`synchronized`关键字和`Lock`接口(如`ReentrantLock`)。 - **volatile与锁的区别**:...

    JAVA并发编程艺术pdf版

    - **线程**:线程是操作系统调度的基本单位,一个进程可以包含多个线程,它们共享进程的内存空间,各自拥有独立的执行流。 - **并发与并行**:并发是指多个任务在同一时间段内交替执行,而并行则是在同一时间点上...

    【并发编程】简单化理解AQS和ReentrantLock.pdf

    互斥锁确保同一时间只有一个线程访问临界区,读写锁允许同时有多个读操作但不允许写操作与任何读写操作同时进行。 - **信号量**:用来控制多个线程对共享资源的访问,可以通过调整信号量值来控制并发数量。 - **原子...

    Python象棋有先后顺序版.rar

    在本项目中,我们关注的是一个使用Python编程语言实现的象棋游戏,特别强调了它采用了多线程技术来处理游戏的并发操作,并且解决了之前版本中无法按正确顺序运行的问题。以下是关于这个项目的详细知识点: 1. **...

Global site tag (gtag.js) - Google Analytics