多线程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(