使用Object.wait()即可实现阻塞,使用Object.notify()解除阻塞,代码示例如下

MainFrame.java

  1. import javax.swing.JFrame;
  2. import javax.swing.JButton;
  3. import java.awt.GridLayout;
  4. import java.awt.event.MouseAdapter;
  5. import java.awt.event.MouseEvent;
  6. import static java.lang.System.out;
  7. import java.util.logging.Level;
  8. import java.util.logging.Logger;
  9.  
  10. public class MainFrame extends JFrame {
  11.  
  12. private JButton blockButton, unblockButton;
  13. private final BlockTest blockTest = new BlockTest();
  14. private static final Logger LOGGER = Logger.getLogger(MainFrame.class.getName());
  15.  
  16. private MainFrame() {
  17. initComponents();
  18. initFrame();
  19. }
  20.  
  21. private void initComponents() {
  22. blockButton = new JButton("阻塞测试");
  23. unblockButton = new JButton("解除阻塞");
  24. unblockButton.setEnabled(false);
  25. blockButton.addMouseListener(new MouseAdapter() {
  26. @Override
  27. public void mouseClicked(MouseEvent ev) {
  28. if (blockButton.isEnabled()) {
  29. //开启一个线程来完成阻塞测试,以避免阻塞应用界面而造成无法响应鼠标键盘的输入
  30. new Thread() {
  31. @Override
  32. public void run() {
  33. try {
  34. blockButton.setEnabled(false);
  35. unblockButton.setEnabled(true);
  36. blockTest.block(); //处于阻塞状态,以下finally块中的代码在阻塞被解除后才会执行
  37. } catch (InterruptedException ex) {
  38. LOGGER.log(Level.SEVERE, null, ex);
  39. } finally {
  40. out.println("mouseClicked(MouseEvent) called");
  41. }
  42. }
  43. }.start();
  44. }
  45. }
  46. });
  47. unblockButton.addMouseListener(new MouseAdapter() {
  48. @Override
  49. public void mouseClicked(MouseEvent ev) {
  50. if (unblockButton.isEnabled()) {
  51. blockTest.unblock();
  52. unblockButton.setEnabled(false);
  53. blockButton.setEnabled(true);
  54. }
  55. }
  56. });
  57. setLayout(new GridLayout(2, 1));
  58. add(blockButton);
  59. add(unblockButton);
  60. }
  61.  
  62. private void initFrame() {
  63. setTitle("block test");
  64. setSize(300, 200);
  65. setLocationRelativeTo(null);
  66. setDefaultCloseOperation(EXIT_ON_CLOSE);
  67. }
  68.  
  69. public static void main(String[] args) {
  70. MainFrame frame = new MainFrame();
  71. frame.setVisible(true);
  72. }
  73. }

BlockTest.java

  1. import static java.lang.System.out;
  2.  
  3. public class BlockTest {
  4.  
  5. public void block() throws InterruptedException {
  6. synchronized (this) {
  7. out.println("阻塞测试");
  8. wait();
  9. out.println("阻塞状态已解除");
  10. }
  11. }
  12.  
  13. public void unblock() {
  14. synchronized (this) {
  15. notify();
  16. out.println("解除阻塞");
  17. }
  18. }
  19. }

使用while循环结合sleep也能实现阻塞,不过对cpu的占用略高

Java中实现函数的阻塞的更多相关文章

  1. 关于C++与Java中虚函数问题的读书笔记

    之前一直用C++编程,对虚函数还是一些较为肤浅的理解.可近期由于某些原因搞了下Java,发现有些知识点不熟,于是站在先驱巨人的肩上谈谈C++与Java中虚函数问题. Java中的虚函数 以下是段别人的 ...

  2. JAVA中字符串函数subString的用法小结

    本篇文章主要是对JAVA中字符串函数subString的用法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助 String str; str=str.substring(int begi ...

  3. Java中的函数对象

    初次听说java中的函数对象可能,比较的陌生.可以类比着来理解一下,人们常说java中没有了指针,殊不知,java中的对象引用就是指针,有时候我们说一个对象往往指的就是这个对象的引用,也就是说基本上把 ...

  4. java中使用Semaphore构建阻塞对象池

    java中使用Semaphore构建阻塞对象池 Semaphore是java 5中引入的概念,叫做计数信号量.主要用来控制同时访问某个特定资源的访问数量或者执行某个操作的数量. Semaphore中定 ...

  5. Java中, 函数的调用、随机数字

    函数:     独立完成某个功能的代码模块.(方法) 作用是为了让代码结构更加良好.模块清晰,实现重用. 函数的四要素:名称,输入值,加工过程,返回值 Java中函数的语法 static 返回类型 函 ...

  6. java中main函数解析(转载)

    从写java至今,写的最多的可能就是主函数 public static void main(String[] args) {} 但是以前一直都没有问自己,为什么要这么写,因为在c语言中就没有这样子的要 ...

  7. java中回调函数的理解

    一,案例一 "通常大家说的回调函数一般就是按照别人(李四)的定好的接口规范写,等待别人(张三)调用的函数,在C语言中,回调函数通常通过函数指针来传递:在Java中,通常就是编写另外一个类或类 ...

  8. java中的函数

    1.函数:定义在类中的具有特定功能的一段独立小程序.函数也称之为方法. 为了提高代码的复用性,对代码进行抽取. 将这个部分定义成一个独立的功能.方便使用. java中对功能的定义通过函数来实现的.2函 ...

  9. Java中substring函数的简单应用

    1.删掉一个字符串中的某个字符 /* * 使用Java 中的 substring()函数删掉字符串中的某个字符 * deleteAssignChar函数的参数说明: * str:被操作的字符串 * o ...

随机推荐

  1. java通过代码控制线程状态,解决线程不安全的问题。

    写两个类,Input,output 两个都是使用同步代码块的方式实现线程间的同步 input类,是为变量赋值 output类,是打印变量 由于线程争夺cpu造成数据的不匹配 通过,设立一个 flag ...

  2. LeetCode OJ--Merge Two Sorted Lists

    http://oj.leetcode.com/problems/merge-two-sorted-lists/ 有序链表的归并排序 #include <iostream> using na ...

  3. codevs——1814 最长链

    1814 最长链  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 现给出一棵N个结点二叉树,问这棵二叉 ...

  4. free如何知道释放内存长度:vs与glibc分配内存时编译器内部处理

    鉴于网上这个资料实在太少,将以前整理过却未完全的一篇文章贴出来,希望大牛指正vs下内存管理方式.可联系gaoshiqiang1987@163.com vs分配内存 vs没有源码,编译器在分配内存时,分 ...

  5. idea的快捷键和操作

    IntelliJ Idea 常用快捷键列表   修改方法如下: 点击 文件菜单(File) –> 点击 设置(Settings… Ctrl+Alt+S), –> 打开设置对话框. 在左侧的 ...

  6. andriod打开摄像头和打开相册

    package com.example.yanlei.picture; import android.support.v7.app.AppCompatActivity; import android. ...

  7. 临远的activiti教程

    1. 简介 协议 下载 源码 必要的软件 JDK 6+ Eclipse Indigo 和 Juno 报告问题 试验性功能 内部实现类 2. 开始学习 一分钟入门 安装Activiti 安装Activi ...

  8. webpack+vue起步

    本文基于vue1.x 基于vue2.x&webpack2.x请移步至 Vue2.x踩坑与总结Webpack2.x踩坑与总结 记得第一次知道Vue.js是在勾三股四大大的微博,那时候他开始翻译v ...

  9. poj 2932 Coneology (扫描线)

    题意 平面上有N个两两不相交的圆,求全部最外层的,即不被其它圆包括的圆的个数并输出 思路 挑战程序竞赛P259页 代码 /* ************************************* ...

  10. C#网络编程系列文章(一)之Socket实现异步TCPserver

    原创性声明 本文作者:小竹zz 本文地址http://blog.csdn.net/zhujunxxxxx/article/details/44258719 转载请注明出处 文章系列文件夹 C#网络编程 ...