使用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. Objective_C与Swift混编遇到的坑(一)

    swift推出已经很长一段时间了,前段时间突然想尝试一些简单的类用swift编写于是便开始了混编的路程. 1.在oc代码里引用swift类:找了很多资料需要添加头文件格式为 #import " ...

  2. Network | DHCP

    动态主机设置协议(Dynamic Host Configuration Protocol, DHCP)是一个局域网的网络协议,使用UDP协议工作,主要有两个用途: 给内部网络或网络服务供应商自动分配I ...

  3. ubuntu和raspberry下调试python_spi备忘

    Ubuntu12.04 自安装python3.3中头文件Python.h路径:usr/local/python3.3/include/python3.3m Ubuntu12.04 自带的Python2 ...

  4. 用hashmap实现自己的缓存

    @SuppressWarnings({"unchecked", "rawtypes"})public class DefaultCache implements ...

  5. 【hibernate】Hibernate中get()和load()的区别

    Hibernate中根据Id单条查询获取对象的方式有两种,分别是get()和load(),来看一下这两种方式的区别. 1. get() 使用get()来根据ID进行单条查询: 1 User user= ...

  6. Go语言_RPC_Go语言的RPC

    一 标准库的RPC RPC(Remote Procedure Call,远程过程调用)是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络细节的应用程序通信协议.简单的说就是要像调用本地函数 ...

  7. 【经验之谈】适合学习的IT教程站点列表

    ①  CSDN   http://www.csdn.net/ ②  gitHub   https://github.com/ ③  极客学院  http://www.jikexueyuan.com/ ...

  8. Swagger学习和实践

    Swagger学习和实践 学习了:https://www.cnblogs.com/zxtceq/p/5530396.html swagger 英 [ˈswægə(r)] 美 [ˈswæɡɚ] vi.昂 ...

  9. UNIX&Linux发展图谱

    来自为知笔记(Wiz)

  10. JD笔试试题(凭记忆写的+人生感悟 try finally )

    京东笔试:技术篇(一套卷.包含測试.算法,研发) 一:填空题(4分 * 15) 15 个 涉及的面很广的选择题,可是比較側重基础.包含数据结构的.c++类的,操作系统的,计算机网络的. 二:编程题(2 ...