`

多线程之ReentrantLock学习

 
阅读更多
package com.test;

public interface IBuffer {  
    public void write();  
    public void read() throws InterruptedException;  
}  



package com.test;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class BufferInterruptibly implements IBuffer {  
  
	//ReentrantLock :可在一个方法中获取  在令一个方法中释放的锁
    private Lock lock = new ReentrantLock();  
  
    public void write() {  
        lock.lock();  
        try {  
            long startTime = System.currentTimeMillis();  
            System.out.println("开始往这个buff写入数据…");  
            for (;;)// 模拟要处理很长时间  
            {  
                if (System.currentTimeMillis() - startTime > Integer.MAX_VALUE)  
                    break;  
            }  
            System.out.println("终于写完了");  
        } finally {  
            lock.unlock();  
        }  
    }  
  
    public void read() throws InterruptedException{  
    	/**
    	 * lockInterruptibly()方法,说明该线程调用该read方法时可以被中断,不比等待write方法结束 释放锁
    	 * lock()方法 说明 read方法 和write 保持同一把锁 ,只有write方法释放该锁 read方法才可操作 否则持续登录 直到获取该锁
    	 */
        lock.lockInterruptibly();// 注意这里,可以响应中断  
        //lock.lock() ;
        try {  
            System.out.println("从这个buff读数据");  
        } finally {  
            lock.unlock();  
        }  
    }  
  
} 



package com.test;

public class Test {  
   public static void main(String[] args) {  
       IBuffer buff = null;  
      
       buff = new BufferInterruptibly();     
       final Writer writer = new Writer(buff);  
       final Reader reader = new Reader(buff);  
       writer.start();  
	   try {
			Thread.sleep(2000) ;
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
       reader.start();  
       new Thread(new Runnable() {  
           public void run() {  
               long start = System.currentTimeMillis();  
               for (;;) {  
                   // 等5秒钟去中断读  
                   if (System.currentTimeMillis() - start > 5000) {  
                       System.out.println("不等了,尝试中断");  
                       reader.interrupt();  
                       break;  
                   }  
 
               }  
               System.out.println("检测终端线程结束");
 
           }  
       }).start();  
   }      
}  
 
   class Writer extends Thread {     
       private IBuffer buff;  
     
       public Writer(IBuffer buff) {  
           this.buff = buff;  
       }  
     
       @Override  
       public void run() {  
    	   System.out.println("write线程开始。。。");
           buff.write();  
           System.out.println("write线程结束!");
       }  
   }  
     
   class Reader extends Thread {  
       private IBuffer buff;  
       public Reader(IBuffer buff) {  
           this.buff = buff;  
       }  
       @Override  
       public void run() {  
           try {  
        	   System.out.println("read线程开始...");
               buff.read();  
           } catch (InterruptedException e) {  
               System.out.println("我不读了");     
           }  
           System.out.println("read结束!");  
       }  
   }  



运行结果:
write线程开始。。。
开始往这个buff写入数据…
read线程开始...
不等了,尝试中断
我不读了
read结束!
检测终端线程结束
分享到:
评论

相关推荐

    深入学习:Java多线程编程

    《深入学习:Java多线程编程》是一本专注于Java并发技术的专业书籍,旨在帮助开发者深入理解和熟练运用Java中的多线程编程。Java多线程是Java编程中的核心部分,尤其在现代高性能应用和分布式系统中不可或缺。理解并...

    多线程基础与基于多线程的简单聊天室

    通过学习和实践这个项目,你可以深入理解多线程的基本原理,以及如何将它们应用到实际的聊天室程序中。同时,也可以在此基础上进一步扩展功能,例如实现更复杂的用户认证、消息加密、文件传输等特性,提升你的编程...

    【JAVA多线程】多线程编程核心技术学习资料

    这份"Java多线程编程核心技术学习资料"正是针对这一主题提供的一份宝贵的学习资源,适合初、中级Java开发人员提升自己的多线程编程技能。 在Java中,多线程主要通过以下方式实现: 1. 继承Thread类:创建一个新的...

    Java+多线程下载源代码学习

    在Java编程语言中,多线程是核心特性之一,它允许程序同时执行多个任务,从而提高了应用程序的效率和响应性。对于大型的网络应用,尤其是涉及文件下载的场景,使用多线程技术可以显著提升用户体验,分段下载数据并行...

    JAVAJAVA多线程教学演示系统论文

    《JAVA多线程教学演示系统》是一篇深入探讨JAVA多线程编程的论文,它针对教育领域中的教学需求,提供了一种生动、直观的演示方式,帮助学生更好地理解和掌握多线程技术。这篇论文的核心内容可能包括以下几个方面: ...

    JAVA 多线程学习笔记

    1. 同步机制:为了解决多线程并发访问共享资源导致的数据不一致问题,Java提供了synchronized关键字、Lock接口(如ReentrantLock)以及相关的并发工具类。 2. synchronized:用于修饰方法或代码块,实现互斥访问。...

    JAVA多线程编程技术PDF

    这份“JAVA多线程编程技术PDF”是学习和掌握这一领域的经典资料,涵盖了多线程的全部知识点。 首先,多线程的核心概念包括线程的创建与启动。在Java中,可以通过实现Runnable接口或继承Thread类来创建线程。创建后...

    java多线程设计模式_java_设计模式_多线程_多线程课题_

    Java多线程设计模式是Java开发中的核心概念,它涉及到如何高效、安全地在多个执行线程之间共享资源和协调任务。...通过阅读《java多线程设计模式》这本书,你可以深入理解这些概念,并学习到更多实际应用的案例。

    多线程示例.rar

    本压缩包“多线程示例.rar”提供了相关的学习材料,适合对多线程感兴趣的开发者进行深入研究。 首先,我们要理解多线程的基本概念。在单核CPU系统中,多线程是通过时间片轮转的方式实现的,系统会快速切换线程的...

    java 多线程并发实例

    在Java编程中,多线程并发是提升程序执行效率、充分利用多核处理器资源的重要手段。本文将基于"java 多线程并发实例"这个主题,深入探讨Java中的多...通过不断学习和实践,我们可以编写出高效、安全的多线程并发程序。

    java实现多线程文件传输

    在Java编程语言中,实现多线程文件传输是一种优化程序性能、提高系统资源...在提供的`java多线程文件传输`压缩包中,可能包含了实现这些概念的示例代码,通过分析和学习,可以更好地理解多线程文件传输的原理和实践。

    java多线程进阶

    通过深入学习这本书,开发者不仅能理解Java多线程的底层机制,还能掌握如何在实际项目中有效利用多线程技术,提升代码的并发性和可维护性。对于想要在Java并发领域进一步提升的开发者来说,这是一本不可多得的参考...

    Java多线程小结

    ### Java多线程小结 #### 一、多线程的概念与意义 多线程是Java编程中的一个重要概念,指的是程序在运行时可以同时执行多个线程的能力。它能够提高程序的性能,尤其是在多核处理器的环境下。多线程使得程序能够更...

    JAVA编写的多线程小弹球测试

    总的来说,"JAVA编写的多线程小弹球测试"项目涵盖了Java多线程、GUI编程、随机数生成和颜色处理等多个重要知识点,是学习和实践Java并发编程的好案例。通过这个项目,开发者不仅可以锻炼到编程技巧,还能深入理解...

    java+多线程+同步详解源代码学习

    Java多线程与同步是Java编程中的核心概念,它们在构建高效、响应迅速的应用程序时起着至关重要的作用。在大型系统开发中,多线程技术使得程序能够同时执行多个任务,提高系统的并发性,而同步机制则确保了在多线程...

    Java多线程编程实战指南-核心篇

    Java的多线程能力是其强大之处,使得开发者能够在同一时间执行多个任务,提高程序效率。本指南将通过实例分析和实践演练,让你深入理解多线程的原理与应用。 首先,我们要了解Java中的线程模型。Java通过Thread类来...

    java多线程和锁,用于学习参考

    Java多线程与锁是Java并发编程中的核心概念,它们在构建高效、可扩展的并发应用程序中起着至关重要的作用。下面将详细讲解这两个主题。 首先,Java中的多线程是指程序执行时可以同时进行多个任务。这得益于操作系统...

    精通java多线程

    通过学习和掌握以上Java多线程的知识点,你将能够编写出更加健壮、高效的多线程程序,有效应对并发场景下的各种挑战。在实际开发中,结合具体业务需求,灵活运用这些概念和工具,可以大大提高代码质量和系统性能。

    多线程实例+源代码

    本资源是由知名讲师张孝祥老师提供的关于多线程的实例教程,旨在帮助学习者深入理解和熟练掌握Java多线程的相关知识。通过这份资料,你将有机会接触到各种线程类的实例,从而提升你的编程能力。 1. **Java多线程...

    Java 多线程学习总结归纳(附代码)

    下面是对Java多线程学习的详细解析。 1. **多线程概述**: 多线程是指一个程序内可以同时执行多个独立的执行流,每个执行流被称为一个线程。Java通过Thread类来代表线程,每个线程都有自己的生命周期,包括新建、...

Global site tag (gtag.js) - Google Analytics