java高级---->Thread之Condition的使用

  Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set(wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。今天我们就通过实例来学习一个Condition的用法。

多线程中Condition的简单使用

一、关于装水取水的例子

  • BoundedBuffer:没有水时可以装水但不能取水,当水满的时候不能装水但能取水。
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

class BoundedBuffer {
    final Lock lock = new ReentrantLock();
    final Condition notFull = lock.newCondition();
    final Condition notEmpty = lock.newCondition();

    final String[] items = new String[10];
    int putptr, takeptr, count;

    public void put(String x) throws InterruptedException {
        lock.lock();
        try {
            while (count == items.length)
                notFull.await();
            items[putptr] = x;
            if (++putptr == items.length) putptr = 0;
            ++count;
            notEmpty.signal();
        } finally {
            lock.unlock();
        }
    }

    public String take() throws InterruptedException {
        lock.lock();
        try {
            while (count == 0)
                notEmpty.await();
            String x = items[takeptr];
            if (++takeptr == items.length) takeptr = 0;
            --count;
            notFull.signal();
            return x;
        } finally {
            lock.unlock();
        }
    }
}
  • ConditionTest1:开启两个线程,分别20次的取水和装水操作。
public class ConditionTest1 {
    public static void main(String[] args) throws Exception {
        final BoundedBuffer boundedBuffer = new BoundedBuffer();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 20; i++) {
                    try {
                        boundedBuffer.take();
                        System.out.print("t" + i + " ");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                for (int i = 0; i < 20; i++) {
                    try {
                        boundedBuffer.put("string" + i);
                        System.out.print("p" + i + " ");
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}

运行的结果如下:不固定

p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 t0 p10 t1 p11 t2 p12 t3 p13 t4 p14 t5 p15 t6 p16 t7 p17 t8 p18 t9 p19 t10 t11 t12 t13 t14 t15 t16 t17 t18 t19 

友情链接

时间: 2024-12-21 19:06:44

java高级---->Thread之Condition的使用的相关文章

java高级----&gt;Thread之Phaser的使用

Phaser提供了动态增parties计数,这点比CyclicBarrier类操作parties更加方便.它是jdk1.7新增的类,今天我们就来学习一下它的用法. Phaser的简单使用 一.Phaser的arriveAndAwaitAdvance方法使用 package com.linux.thread.thread; import java.util.concurrent.Phaser; public class PhaserRun1 { public static void main(St

java高级----&gt;Thread之ScheduledExecutorService的使用

ScheduledExecutorService的主要作用就是可以将定时任务与线程池功能结合使用.今天我们来学习一下ScheduledExecutorService的用法.我们都太渺小了,那么容易便湮没于各自的殊途. ScheduledExecutorService的简单使用 一.使用scheduleAtFixedRate()方法实现周期性执行 public class ScheduledExecutorServiceTest { public static void main(String[]

Java高级复习㈠ 多线程

1.线程 也称为轻量级进程,每个线程有自己的堆栈.程序计数器.局部变量.与进程相比,进程中的线程之间隔离程度要小 2.Java实现 ①implements Runnable ②extends Thread 一般推荐① 3.sleep().yield() sleep()方法对当前线程操作,指定以毫秒为单位的线程最小休眠时间,除非线程因中断提早恢复执行,否则不会在这段时间前恢复执行.线程可调用另一线程的interrupt()方法,向暂停的线程发出InterruptedException,变相唤醒暂停

java并发控制:ReentrantLock Condition使用详解

我们通过一个实际的例子来解释Condition的用法: 我们要打印1到9这9个数字,由A线程先打印1,2,3,然后由B线程打印4,5,6,然后再由A线程打印7,8,9. 这道题有很多种解法,现在我们使用Condition来做这道题(使用Object的wait,notify方法的解法在这里). package cn.xband.locks; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.

Java高级篇——网络通信

JAdam Java高级篇(二)--网络通信 网络编程是每个开发人员工具相中的核心部分,我们在学习了诸多Java的知识后,也将步入几个大的方向,Java网络编程就是其中之一. 如今强调网络的程序不比涉及网络的更多.除了经典的应用程序,如电子邮件.Web浏览器和远程登陆外,大多数主要的应用程序都有某种程度的内质网络功能.比如我们最常使用的IDE(Eclipse/IDEA)与源代码存储库(GitHub等等)进行通信:再比如Word,可以从URL打开文件:又或者是我们玩的众多联机游戏,玩家实时相互对战

Java高级程序员面试大纲——备战金三银四跳槽季

跳槽时时刻刻都在发生,但是我建议大家跳槽之前,先想清楚为什么要跳槽.切不可跟风,看到同事一个个都走了,自己也盲目的开始面试起来(期间也没有准备充分),到底是因为技术原因(影响自己的发展,偏移自己规划的轨迹),还是钱给少了,不受重视. 准备不充分的面试,完全是浪费时间,更是对自己的不负责(如果title很高,当我没说). 今天给大家分享下chenssy在这次跳槽中整理的Java面试大纲,其中大部分都是面试过程中的面试题,可以对照这查漏补缺,当然了,这里所列的肯定不可能覆盖全部方式. 项目介绍 大部

Java多线程——Thread的native底层实现

Java多线程 当我们去阅读java的Thread类的时候,会发现这个类与大部分的java类库API有着明显的差别,它的所有关键方法都被声明为native. native本身指代的就是本地方法,而又由于java线程模型采用基于操作系统原生线程模型,这里默认Thread中native方式代指的是Native POSIX Thread Library. 线程的实现方式有三种:分别是内核线程实现(1:1实现),使用用户线程实现(1:N),使用用户线程加轻量级进程混合实现(N:M实现).而Java从1.

java 线程 --- Thread,Runnable,Callable 基础学习

java 使用 Thread 类代表线程,所有现场对象都必须是 Thread 类或者其子类的实例.每个线程的作用是完成一定的任务,实际上就是执行一段程序流.java 使用线程执行体来代表这段程序流. 1.继承Thread 类创建线程 启动多线程的步骤如下: (1)定义Thread 类的子类,并重写该类的run() 方法,该run() 方法的方法体就代表类线程需要完成的任务.因此把run() 方法称为线程执行体. (2)创建 Thread 子类的实例,即创建线程对象. (3)调用线程的star()

java高级编程的教程

java高级编程说的就是编程思想,在学习完Java基础以后就是编程的,推荐可以去看看<Java编程思想>这本书籍,还不错. Java已经成为了编程语言的骄子.我们可以看到,越来越多的大学在教授数据结构.程序设计和算法分析等课程时,选择以Java语言为载体.这本赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形. 这本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面