Java线程_03

持有锁的线程释放锁的场景

  1. 加锁的代码块执行完成
  2. 加锁的代码块执行过程中出现异常线程终止
  3. Object#wait会释放锁

不会释放锁

  1. sleep()/join()
  2. sleep()的目的是让线程暂停指定时间,时间过后线程会继续运行
  3. join()的目的是让线程等待指定线程执行完成后,它才开可以运行

Thread#interrupt

  1. 适用与中断处在blocking method状态的线程
  1. Blocking method包括wait()/join()/sleep()
  2. 可使用isInterrpted()访问线程中断标识
  3. 调用Interrupt时可能会抛出InterruptedException异常
  4. 处理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");
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值