使用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的占用略高

最新文章

  1. 网页js,DIV全屏布局
  2. 跨站脚本 XSS<一:介绍>
  3. 图片格式转换之ImageMagick
  4. C#方法解析
  5. [RxJS] Observables can throw errors
  6. Codeforces Round #312 (Div. 2)
  7. U-Boot 内核 (一)
  8. 作为一个零基础的新手,如何系统的自学Java和JavaEE开发技术?
  9. cnpm install -g live-server 安装服务
  10. spring boot @ResponseBody转换JSON 时 Date 类型处理方法,Jackson和FastJson两种方式,springboot 2.0.9配置fastjson不生效官方解决办法
  11. Struts2的初级应用
  12. c++中的c_str()用法
  13. ORA-01219: 数据库未打开: 仅允许在固定表/视图中查询解决之道
  14. linux chmod 给目录或文件赋权限 可读可写可执行
  15. Python之密度聚类
  16. Firefox滚动残影(转)
  17. Panel结构
  18. react 实现在调父render时,子组件会重新更新
  19. 修改Subversion用户登录密码
  20. backend community-driven web framework

热门文章

  1. netsh配置Windows防火墙(advfirewall)
  2. python笔记1:python基础
  3. [笔记][Web]利用JS生成博文目录及CSS定制博客
  4. 着陆攻击LAND Attack
  5. QBXT T15565 Day4上午道路分组
  6. numpy常用函数学习
  7. JDK/Java SE官方文档汇总
  8. win10安装 迅雷
  9. VS"后生成事件" 菜单的使用
  10. 全文索引-lucene,solr,nutch,hadoop之nutch与hadoop