Loading

多线程Demo学习(线程的同步,简单的线程通信)

一.线程的同步

我们使用多线程编程的一个重要原因在于方便数据的共享。 但是共享就意味着存在安全性问题:如果两个线程同时修改一个数据,该听谁的?这就引发了同步问题。

1.下面我们用一个银行存入的例子来演示多线程编程的非同步的场景
下面一个银行实例类:

public class Bank {
   
    private int account = 100;// 假设账户的初始金额是100

    public void deposit(int money) {
   // 向账户存钱的方法
        account += money;
    }

    public int getAccount() {
   // 获得账户金额的方法
        return account;
    }
}

下面是一个银行的操作任务类:

import javax.swing.JTextArea;

public class Transfer implements Runnable {
   
    private Bank bank;
    private JTextArea textArea;

    public Transfer(Bank bank, JTextArea textArea) {
   // 利用构造方法初始化变量
        this.bank = bank;
        this.textArea = textArea;
    }

    public void run() {
   
        for (int i = 0; i < 100; i++) {
   // 循环10次向账户存钱
            bank.deposit(10);// 向账户存入10块钱
            String text = textArea.getText();// 获得文本域内容
            textArea.setText(text + "账户的余额是:" + bank.getAccount() + "\n");
        }
    }
}

下面是应用场景类:

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 javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.UIManager;
import java.awt.Font;

public class UnsynchronizedBankFrame 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 {
   
					UnsynchronizedBankFrame frame = new UnsynchronizedBankFrame();
					frame.setVisible(true);
				} catch (Exception e) {
   
					e.printStackTrace();
				}
			}
		});
	}

	public UnsynchronizedBankFrame() {
   
		setTitle("\u975E\u540C\u6B65\u7684\u6570\u636E\u8BFB\u5199");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(new BorderLayout(0, 0));

		JPanel buttonPanel = new JPanel();
		contentPane.add(buttonPanel, BorderLayout.SOUTH);

		JButton startButton = new JButton("\u5F00\u59CB\u5B58\u94B1");
		startButton.setFont(new Font("微软雅黑", Font.PLAIN, 16));
		startButton.addActionListener(new ActionListener() {
   
			public void actionPerformed(
posted @ 2020-12-20 12:37  文牧之  阅读(31)  评论(0)    收藏  举报  来源