package com.test3;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* 线程通信例子(基于可重入锁ReentrantLock,一对Condition实现)
* */
public class PC2 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Q2 q = new Q2();
new Producer2(q);
new Customer2(q);
}
}
/**
* 阻塞队列
* */
class Q2{
int n;
final Lock lock = new ReentrantLock();
//说明:canGet和canPut可以合并成一个
final Condition canGet = lock.newCondition();
final Condition canPut = lock.newCondition();
boolean valueSet = false;
int get(){
//实现可响应中断的锁
try {
lock.lockInterruptibly();
//值未设置好,循环等待
while(!valueSet){
canGet.await();
}
//取值成功
System.out.println("Got:"+n);
//将设置标志置为false
valueSet = false;
Thread.currentThread().sleep(1000);
//通知设值线程
canPut.signal();
return n;
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}finally{
lock.unlock();
}
return 0;
}
void put(int n){
try {
//实现可响应中断的锁
lock.lockInterruptibly();
//已经设置好了值,而且未被取走,循环等待
while(valueSet){
canPut.await();
}
this.n = n;
//将设置标志设置为true
valueSet = true;
System.out.println("Put:"+n);
Thread.currentThread().sleep(1000);
//通知取值线程,可以取值
canGet.signal();//相当于notify() ,signalAll()相当于notifyAL
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
/**
* 生产者
* */
class Producer2 implements Runnable{
Q2 q;
public Producer2(Q2 q){
this.q = q;
new Thread(this,"Producer").start();
}
@Override
public void run() {
// TODO Auto-generated method stub
int i=0;
while(true){
q.put(i++);
}
}
}
/**
* 消费者
* */
class Customer2 implements Runnable{
Q2 q;
public Customer2(Q2 q){
this.q=q;
new Thread(this,"Customer").start();
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
q.get();
}
}
}
分享到:
相关推荐
Java中的`ReentrantLock`是Java并发包`java.util.concurrent.locks`中的一个高级锁机制,它是可重入的互斥锁,具有与`synchronized`关键字...在设计和实现多线程程序时,了解和正确使用`ReentrantLock`是非常重要的。
Java多线程中ReentrantLock与Condition详解 ReentrantLock是Java多线程中一种高级的锁机制,它实现了Lock接口,提供了与synchronized相同的并发性和内存语义,但添加了一些特性,如锁投票、定时锁等候和可中断锁...
总结来说,ReentrantLock在Java多线程编程中扮演着关键角色,提供了灵活的锁管理机制,包括公平性和非公平性选择,以及可中断和定时的锁获取方式。了解和熟练掌握ReentrantLock的使用,能够帮助开发者编写出高效、...
Java中的多线程编程在处理并发问题时是至关重要的,特别是在高并发环境下,对资源的精确控制成为提高系统效率的关键。本篇文章将深入探讨`ReentrantLock`的使用,它是Java并发包`java.util.concurrent.locks`中的一...
5. **ReentrantLock和Condition**:如果不想使用`synchronized`关键字,可以使用`java.util.concurrent.locks.ReentrantLock`和`Condition`接口,它们提供了更细粒度的锁控制和更灵活的等待/通知机制。 6. **死锁和...
Java多线程ReentrantLock互斥锁详解 ReentrantLock是Java多线程编程中的一种锁机制,它可以实现线程之间的同步访问资源。ReentrantLock的主要特点是可以重入,即一个线程可以多次获得锁,而不需要释放锁。这种机制...
摘要:本篇文章主要介绍了 Java 多线程加锁机制和 Condition 类的使用实例解析,通过示例代码详细介绍了多线程加锁和 Condition 类的使用方法,对大家的学习或者工作具有一定的参考学习价值。 一、Java 多线程加锁...
`ReentrantLock`提供了更多的选择和控制。例如,可以通过构造函数传入`true`参数创建公平锁,这样线程会按照等待顺序获取锁,而不是像非公平锁那样随机获取。默认情况下,`ReentrantLock`是非公平的。`lock.isFair...
Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了系统的效率和响应性。在Java中,多线程的实现主要通过两种方式:继承Thread类和实现Runnable接口。理解并掌握多线程的使用对于任何Java开发者...
Java提供了一系列的同步机制来解决这些问题,如synchronized关键字、wait()、notify()和notifyAll()方法,以及Lock接口(如ReentrantLock)和Condition对象。实验指导书中可能详细讲解了如何使用这些工具确保线程...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在现代计算机系统中,多线程技术尤其关键,因为它们能够充分利用多核处理器的能力。这份"Java多线程编程...
在编程领域,多线程是一种常见的技术,它允许程序同时执行多个不同的任务,极大地提高了程序的效率和响应性。本文将深入探讨多线程的概念、重要性以及如何在实际项目中应用多线程,特别关注Java语言中的多线程实现。...
Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,提高了软件的效率和响应性。在Java中,多线程的实现主要有两种方式:通过继承Thread类和实现Runnable接口。这篇资料深入探讨了Java多线程的相关知识...
多线程的使用涉及到一系列概念,如线程同步、锁和条件变量,这些都是确保线程安全和正确性的重要工具。 线程同步是指控制多个线程对共享资源的访问,以防止数据的不一致性和竞态条件。竞态条件是指当两个或更多线程...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,极大地提高了程序的效率和响应性。在Java中,多线程主要通过继承Thread类或实现Runnable接口来实现。本教程《Java多线程编程核心技术》将...
该示例主要介绍了如何使用Java多线程技术来实现文件的读写操作,包括文件的写入、读取和同步控制等。 标题:Java多线程读写文件示例 描述:主要介绍了Java多线程读写文件示例,需要的朋友可以参考下 标签:多线程...
Java中的单线程和多线程是编程中的关键概念,特别是在服务器端开发中。了解它们的原理和应用对于构建高效、可扩展的客户端-服务器应用至关重要。以下是对这些概念的详细解析。 首先,我们来谈谈单线程。在Java中,...
Java多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个任务,提高了程序的效率和响应速度。本文将深入探讨Java多线程的相关概念、线程类和接口的使用,以及线程的同步与互斥。 首先,我们需要理解进程与...
2. **线程同步**:为了解决多线程中的数据安全问题,Java提供了多种同步机制,如`synchronized`关键字、`volatile`变量、`Lock`与`Condition`接口、`ReentrantLock`等。这些内容在书中会有详细讲解,包括它们的工作...
在Java编程中,多线程是一项关键技能,尤其在处理并发任务、提高系统效率和响应速度时至关重要。本文将深入探讨Java项目中最简单的多线程使用方法,通过一个名为"thread-test"的示例项目来讲解如何在企业实际场景中...