在这里插入图片描述# JAVA中的多线程问题
利用线程模拟文件复制的进度显示
点击”复制文件”,开始显示进度条,并实时显示复制进度,复制完成后显示“文件复制已完成!”,点击“取消”,取消复制,进度条归零,点击“×”可以退出系统,注意复制按钮和取消按钮在同一时间,只有一个可用。
package com.company;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class Progress extends JFrame implements ActionListener {
// private static final long serialVersionID = 1L;
JButton jbtn_copy,jbtn_cancel;//复制和取消按钮
JLabel jbl_show;//显示进度的label
JProgressBar jpbar;//进度条
CopyFilesThread copyFilesthread;
Progress()
{
super("文件复制进度条演示");
this.setBounds(100,200,600,300);
this.setLayout(new GridLayout(3,1));//设置为网格布局,三行一列
this.setResizable(false);//此窗格不可由用户调整大小
JPanel jp1 = new JPanel();
jbtn_copy = new JButton("复制文件");
jbtn_copy.addActionListener(this);
jp1.add(jbtn_copy);
jbtn_cancel = new JButton("取消");
jbtn_cancel.setEnabled(false);//取消按钮不可用
jbtn_cancel.addActionListener(this);
jp1.add(jbtn_cancel);
this.getContentPane().add(jp1);
JPanel jp2 = new JPanel();
jbl_show = new JLabel();
jp2.add(jbl_show);
this.getContentPane().add(jp2);
JPanel jp3 = new JPanel();
jpbar = new JProgressBar();
jpbar.setOrientation(JProgressBar.HORIZONTAL);//设置水平进度条
jpbar.setMinimum(0);//设置进度条的最小进度
jpbar.setMaximum(100);//设置进度条的最大进度
jpbar.setValue(0);//设置进度条的当前进度
jpbar.setStringPainted(true);//设置进度条中间显示的百分数
jpbar.setForeground(Color.blue);
jpbar.setPreferredSize(new Dimension(600,80));//设置进度条的长度和宽度
jpbar.setBorderPainted(true);//进度条绘制边框
jp3.add(jpbar);
this.getContentPane().add(jp3);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);//设置退出整个程序
this.setVisible(true);//设置窗口可见
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == jbtn_copy)
{
copyFilesthread = new CopyFilesThread(jpbar,jbtn_copy,jbl_show);
copyFilesthread.start();
jbtn_copy.setEnabled(false);//设置复制按钮不可用
jbtn_cancel.setEnabled(true);//设置取消按钮可用
}
if(e.getSource() == jbtn_cancel)
{
copyFilesthread.stop();
jbtn_copy.setEnabled(true);//设置复制按钮可用
jbtn_cancel.setEnabled(false);//设置取消按钮不可用
jbl_show.setText("");
jpbar.setValue(0);
}
}
public static void main(String [] args)
{
new Progress();
}
class CopyFilesThread extends Thread {
JProgressBar jpbar;
JButton jbtn;
JLabel jb1;
CopyFilesThread(JProgressBar jpbar, JButton jbtn, JLabel jb1) {
this.jpbar = jpbar;
this.jbtn = jbtn;
this.jb1 = jb1;
}
public void run() {
for (int i = jpbar.getMinimum(); i <= jpbar.getMaximum(); i++) {
try {
jpbar.setValue(i);
Thread.sleep(200);
jb1.setText("文件复制完成" + i + "%");
} catch (Exception e) {
e.printStackTrace();
}
}
jb1.setText("文件复制完成!");
}
}
}
运行效果如下
多线程模拟银行存款问题
模拟一个银行存款的程序。假设有三个储户都去银行往同一个账户进行存款,一次存100,每人存三次。要求储户每存一次钱,账户余额增加100,并在控制台输出当前账户的余额。
package com.company;
import java.util.concurrent.locks.ReentrantLock;
//存款,三个人去银行往同一账户存钱,每人存三次,显示账户余额,设置三个线程,每次执行一个线程,账户余额加100
public class Account{
String name;//账户名
double balance;//账户余额
public Account(String name)
{
this.name = name;
this.balance = 0;
}
public void put(double value)
{
if(value > 0)
{
this.balance += value;
}
}
public static void main(String [] args)
{
Account wang = new Account("wang");
(new LockedSaveThread(wang,100)).start();
(new LockedSaveThread(wang,100)).start();
(new LockedSaveThread(wang,100)).start();
(new LockedSaveThread(wang,100)).start();
(new LockedSaveThread(wang,100)).start();
(new LockedSaveThread(wang,100)).start();
(new LockedSaveThread(wang,100)).start();
(new LockedSaveThread(wang,100)).start();
(new LockedSaveThread(wang,100)).start();
}
}
class LockedSaveThread extends Thread //存款线程类
{
private Account account;//账户
private double value;//存款金额
public LockedSaveThread(Account account,double value)
{
this.account = account;
this.value = value;
}
public void run()
{
synchronized (this.account)
{
double howmatch = this.account.balance;
try
{
Thread.sleep(1);
}catch(InterruptedException ex)
{
}
this.account.put(this.value);
System.out.println(this.getClass().getName()+"," + "账户:现有"+howmatch+",存入"+this.value+",余额"+this.account.balance);
}
}
}
运行效果如下
个人总结:多线程开发是项目开发过程中一个非常重要的部分,要重视起来并且能够熟练应用。