Loading

多线程Demo学习(使用信号量实现线程同步,使用原子变量实现线程同步)

一.使用信号量实现线程同步

信号量是Dijkstra在1968年发明,它最初是用来在进程间发信号的一个整数值,一个信号量有且仅有3种操作,且它们全部都是原子操作:初始化,增加和减少。 它的增加可以为一个进程解除阻塞,减少可以让一个进程进入阻塞。 Java为线程提供了信号量支持,本实例将通过向银行存款的例子来实现信号量的同步。

我们先运行看一下效果:

import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JButton;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.GridLayout;
import java.util.concurrent.Semaphore;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import java.awt.Font;
import javax.swing.UIManager;

public class SynchronizedBankFrame extends JFrame {
   
    private static final long serialVersionUID = 2671056183299397274L;
    private JPanel contentPane;
    private JTextArea thread1TextArea;
    private JTextArea thread2TextArea;

    public static void main(String[] args) {
   
        try {
   
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
        } catch (Throwable e) {
   
            e.printStackTrace();
        }
        EventQueue.invokeLater(new Runnable() {
   
            public void run() {
   
                try {
   
                    SynchronizedBankFrame frame = new SynchronizedBankFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
   
                    e.printStackTrace();
                }
            }
        });
    }

    public SynchronizedBankFrame() {
   
        setTitle("\u4F7F\u7528\u4FE1\u53F7\u91CF\u5B9E\u73B0\u7EBF\u7A0B\u540C\u6B65");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 450, 300);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.
posted @ 2020-12-22 18:21  文牧之  阅读(14)  评论(0)    收藏  举报  来源