java中的多线程问题

在这里插入图片描述# 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);
        }
    }
}


运行效果如下
在这里插入图片描述
个人总结:多线程开发是项目开发过程中一个非常重要的部分,要重视起来并且能够熟练应用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值