Java线程_03
来源:互联网 发布:知美术馆官网 电话 编辑:程序博客网 时间:2024/05/22 16:46
持有锁的线程释放锁的场景
- 加锁的代码块执行完成
- 加锁的代码块执行过程中出现异常线程终止
- Object#wait会释放锁
不会释放锁
- sleep()/join()
- sleep()的目的是让线程暂停指定时间,时间过后线程会继续运行
- join()的目的是让线程等待指定线程执行完成后,它才开可以运行
Thread#interrupt
- 适用与中断处在blocking method状态的线程
- Blocking method包括wait()/join()/sleep()
- 可使用isInterrpted()访问线程中断标识
- 调用Interrupt时可能会抛出InterruptedException异常
- 处理InterruptedException异常时,需要注意重新设置线程中断标记
示例
简单秒表
package org.ybygjy.thread3th.minutes;import java.awt.BorderLayout;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JTextField;import javax.swing.SwingUtilities;/** * 秒表主面板 * <p> * 负责呈现时间 * <p> * 负责 * @author WangYanCheng * @version 2012-10-1 */public class StopWatch { /** 用于呈现时间 */ private JTextField timerValue; /** 时间构建线程 */ private TimeThread timerThread; /** * Constructor */ public StopWatch() { this.timerValue = new JTextField("00:18:22 516"); timerThread = new TimeThread(this); timerThread.start(); } /** * 逻辑处理入口 * <p> * 负责创建JFrame * <p> * 负责组织各组件关系 */ public void doWork() { JFrame jframe = new JFrame("秒表"); jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jframe.setContentPane(this.createContentPanel()); jframe.setSize(300, 100); jframe.setResizable(false); jframe.setVisible(true); } /** * 主面板,充做组件容器 * @return jPanel {@link JPanel} */ private JPanel createContentPanel() { JPanel jPanel = new JPanel(); jPanel.setLayout(new BorderLayout()); jPanel.add(this.createOpbar(), BorderLayout.NORTH); jPanel.add(this.timerValue, BorderLayout.CENTER); return jPanel; } /** * 控制面板,控制按钮的容器 * @return rtnPanel {@link JPanel} */ private JPanel createOpbar() { JPanel rtnPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 5)); final JButton startBtn = new JButton("开始"); final JButton suspendBtn = new JButton("暂停"); rtnPanel.add(startBtn); rtnPanel.add(suspendBtn); startBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { timerThread.setDone(false); } }); suspendBtn.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { timerThread.setDone(true); } }); return rtnPanel; } /** * 重绘时间 * @param timeValue 时间串 */ public void repaintTimeValue(final String timeValue) { SwingUtilities.invokeLater(new Runnable() { public void run() { timerValue.setText(timeValue); } }); } /** * 测试入口 * @param args 参数列表 */ public static void main(String[] args) { new StopWatch().doWork(); }}
package org.ybygjy.thread3th.minutes;import java.text.SimpleDateFormat;import java.util.Calendar;/** * 负责实现秒表时间 * @author WangYanCheng * @version 2012-10-1 */public class TimeThread extends Thread { /** 暂停标记 */ private boolean isDone; /** 秒表呈现组件 */ private StopWatch swInst; /** * Constructor * @param swInst {@link StopWatch} */ public TimeThread(StopWatch swInst) { this.swInst = swInst; // 默认为暂停 this.isDone = true; } @Override public synchronized void run() { while (true) { try { if (isDone) { wait(); } // 产生时间串 swInst.repaintTimeValue(getTimeStr()); //sleep(10); wait(10); } catch (InterruptedException e) { e.printStackTrace(); } } } /** * 暂停标记 * @param isDone {true:暂停;false:继续} */ public synchronized void setDone(boolean isDone) { if (this.isDone == isDone) { return; } this.isDone = isDone; notify(); } /** * 生成时间串 * @return rtnStr 时间串 */ private String getTimeStr() { return sdfInst.format(Calendar.getInstance().getTime()); } /** 时间格式串 */ private static SimpleDateFormat sdfInst = new SimpleDateFormat("HH:mm:ss SS");}
- Java线程_03
- java基础总结_03
- Java学习笔记_03
- java多态_03
- JNI(Java Native Interface)_03
- thinking in java 21_03
- JAVA语言学习_03(关于枚举类型)
- Java从基础开始_03面向对象
- JAVA高级01_03 String类学习 2011-4-20
- 黑马程序员_03. java语言的基本组成
- java集合框架之List------03_03 Queue PriorityQueue ArrayDeque
- 深入理解Java虚拟机_03虚拟机执行子系统
- 初始化_03
- 整理_03
- 《Java就业培训教程》_张孝祥_书内源码_03
- 黑马程序员--JAVA基础_03(继承、final修饰符、抽象、模版方法设计模式)
- Java千百问_03基本语法(002)_java都有哪些关键字
- Java千百问_03基本语法(003)_public、privite、protected有什么区别
- char和vchar,varchar和nvarchar的区别
- javaSE学习笔记3
- 怎么使用ST的库开发STM32
- 你真的了解javascript中的null和undefined吗
- Ubuntu 解压 命令集
- Java线程_03
- 在用^交换a,b值时操作地址和操作值的区别
- Java参数传递过程中 传形参和传引用问题讨论
- hdu 4285 circuits(插头DP多条回路无嵌套环)
- 学习设计模式_01 GOF, 设计模式和J2EE
- 字符串循环移位
- Xmanager Failed to get the installation date from the system registry的解决方法
- MyEclipse中SVN的使用方法
- Android下PocketSphinx的离线语音识别