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

MainFrame.java

import javax.swing.JFrame;
import javax.swing.JButton;
import java.awt.GridLayout;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import static java.lang.System.out;
import java.util.logging.Level;
import java.util.logging.Logger; public class MainFrame extends JFrame { private JButton blockButton, unblockButton;
private final BlockTest blockTest = new BlockTest();
private static final Logger LOGGER = Logger.getLogger(MainFrame.class.getName()); private MainFrame() {
initComponents();
initFrame();
} private void initComponents() {
blockButton = new JButton("阻塞测试");
unblockButton = new JButton("解除阻塞");
unblockButton.setEnabled(false);
blockButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent ev) {
if (blockButton.isEnabled()) {
//开启一个线程来完成阻塞测试,以避免阻塞应用界面而造成无法响应鼠标键盘的输入
new Thread() {
@Override
public void run() {
try {
blockButton.setEnabled(false);
unblockButton.setEnabled(true);
blockTest.block(); //处于阻塞状态,以下finally块中的代码在阻塞被解除后才会执行
} catch (InterruptedException ex) {
LOGGER.log(Level.SEVERE, null, ex);
} finally {
out.println("mouseClicked(MouseEvent) called");
}
}
}.start();
}
}
});
unblockButton.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent ev) {
if (unblockButton.isEnabled()) {
blockTest.unblock();
unblockButton.setEnabled(false);
blockButton.setEnabled(true);
}
}
});
setLayout(new GridLayout(2, 1));
add(blockButton);
add(unblockButton);
} private void initFrame() {
setTitle("block test");
setSize(300, 200);
setLocationRelativeTo(null);
setDefaultCloseOperation(EXIT_ON_CLOSE);
} public static void main(String[] args) {
MainFrame frame = new MainFrame();
frame.setVisible(true);
}
}

BlockTest.java

import static java.lang.System.out;

public class BlockTest {

    public void block() throws InterruptedException {
synchronized (this) {
out.println("阻塞测试");
wait();
out.println("阻塞状态已解除");
}
} public void unblock() {
synchronized (this) {
notify();
out.println("解除阻塞");
}
}
}

使用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. [原创][Verilog]个人.v文件书写规范

    1> 文件名命名,小些单词为主且从命名中可以大致读出其功能,例如:fpga_power.v,can_ctrl.v等命名. 2> 顶层top文件的输入输出IO信号使用大些表示,且加上”i/o ...

  2. Xamarin.Forms的ActivityIndicator和ProgressBar比较

    Xamarin.Forms的ActivityIndicator和ProgressBar比较   在Xamarin.Forms中,控件ActivityIndicator和ProgressBar都用来表示 ...

  3. [Bzoj3687]简单题(bitset)

    3687: 简单题 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1150  Solved: 565[Submit][Status][Discuss] ...

  4. IIS下安装memcached管理工具—MemAdmin

    1.先看这篇文章 http://www.cnblogs.com/joylee/archive/2013/01/07/memadmin.html . 2.在IIS下安装的php-cgi.exe程序版本为 ...

  5. Generate C and C++ Header File

    1. 2. 其中bootclasspath 后面的参数就是自己android.jar具体位置 location: ${system_path:javah} working Directoy: ${pr ...

  6. SilverLight-DataBinding:二、Bingding to a Collection Objects(绑定一个集合对象)

    ylbtech-SilverLight-DataBinding: Bingding to a Collection Objects(绑定一个集合对象) 1.A, Building  a Data Ob ...

  7. 【Todo】Java学习路线(方向指导)

    在网上搜了下Java学习路线(关键词:学习,因为众所周知,实践出牛人,在平时工作不怎么深入的情况下,才强调学习的方向的重要性 ^_^) 发现下面知乎这个回答写的真好.mark如下: https://w ...

  8. C++ 用libcurl库进行http通讯网络编程 【转】

    http://www.cnblogs.com/moodlxs/archive/2012/10/15/2724318.html C++ 用libcurl库进行http通讯网络编程 目录索引: 一.Lib ...

  9. 赵雅智_Android案例_刮刮乐

    实现效果 主要代码 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...

  10. gulp-gulpfile.js语法说明

    关于gulpfile文件: 直接上代码吧!! /*! * gulp * $ npm install gulp gulp-ruby-sass gulp-cached gulp-uglify gulp-r ...