前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【JAVA】多线程学习

【JAVA】多线程学习

作者头像
韩旭051
发布2019-12-03 11:55:43
4320
发布2019-12-03 11:55:43
举报
文章被收录于专栏:刷题笔记刷题笔记

版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。

1、利用线程模拟文件复制的进度显示,如下图所示,点击“复制文件”,开始显示进度条,并实时显示复制进度,复制完成后显示“文件复制已完成!”,点击“取消”,取消复制,进度条归零,点击“×”可以退出系统,注意复制按钮和取消按钮在同一时间,只有一个可用。

代码语言:javascript
复制
package com;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class WelcomeJFrame extends JFrame {
    public WelcomeJFrame(){
        super("实验八多线程 文件复制进度条演示");
        this.setBounds(300,240,400,300);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        this.setLayout(new GridLayout(4,1));

        JButton jb1 = new JButton();
        jb1.setText("确认");
        JButton jb2 = new JButton();
        jb2.setText("取消");
        if(jb2.isEnabled()){
            jb1.setEnabled(false);
        }
        if(jb1.isEnabled()){
            jb2.setEnabled(false);
        }
        this.add(jb1,BorderLayout.NORTH);
        this.add(jb2);

        JLabel jLabel= new JLabel();
        this.add(jLabel);
        jLabel.setText("文件复制0%");
        final int[] currentProgress = {0};
        final JProgressBar progressBar = new JProgressBar();
        final int MIN_PROGRESS = 0;
        final int MAX_PROGRESS = 100;
        Timer timer = new Timer(50, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                currentProgress[0]++;
                if (currentProgress[0] > MAX_PROGRESS) {
                    currentProgress[0] = MIN_PROGRESS;
                }
                jLabel.setText("文件复制"+currentProgress[0]+"%");
                progressBar.setValue(currentProgress[0]);
            }
        });

        jb1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                jb2.setEnabled(true);
                jb1.setEnabled(false);
                timer.start();
            }
        });
        jb2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                jb1.setEnabled(true);
                jb2.setEnabled(false);
                currentProgress[0]=0;
                jLabel.setText("文件复制"+currentProgress[0]+"%");
                progressBar.setValue(currentProgress[0]);
                timer.start();
                timer.stop();

            }
        });


        progressBar.setMinimum(MIN_PROGRESS);
        progressBar.setMaximum(MAX_PROGRESS);
        progressBar.setStringPainted(true);

        progressBar.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                System.out.println("当前进度值: " + progressBar.getValue() + "; " +
                        "进度百分比: " + progressBar.getPercentComplete());
            }
        });
        progressBar.setValue(currentProgress[0]);


        // 添加到内容面板
        this.add(progressBar);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        new WelcomeJFrame();


        CopyFile cf1 = new CopyFile("C:\\Users\\hx\\Videos\\COPY\\hang1.txt", "C:\\Users\\hx\\Videos\\COPY\\hang2.txt");
        cf1.start();
    }
}
代码语言:javascript
复制
package com;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DecimalFormat;

public class CopyFile extends Thread {

    public File older;// 源文件路径
    public File newer;// 复制目标路径

    public CopyFile(String older, String newer) {
        this.older = new File(older);
        this.newer = new File(newer);
    }



    @Override
    public void run() {

        FileInputStream fis = null;
        FileOutputStream fos = null;

        try {
            fis = new FileInputStream(older);
            fos = new FileOutputStream(newer);

            byte[] b = new byte[1024];// 声明一个字节数组,每次读取的数据存到该字节数组里
            int length = 0;// 返回每次读取的数据长度
            long len = older.length();// 获取源文件的长度
            double temp = 0;
            DecimalFormat df = new DecimalFormat("##%");

            while ((length = fis.read(b)) != -1) {
                fos.write(b, 0, length);// 把每次读取的内容,输出到目标路径文件中
                temp += length;// 把每次读取的数据长度累加
                double d = temp / len;// 计算出已经读取的长度占文件总长度的比率
                int jd = (int) d;
                if (jd % 10 == 0) {

                    System.out.println(older.getName() + "文件复制了:" + df.format(d));

                }

            }

            System.out.println(older.getName() + "复制完毕!");
        } catch (IOException e) {

            e.printStackTrace();

        } finally {
            try {

                fis.close();
                fos.close();

            } catch (IOException e) {

                e.printStackTrace();

            }

        }



    }

}
代码语言:javascript
复制
package com;

import javax.swing.*;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class WelcomeJFrame extends JFrame {
    public WelcomeJFrame(){
        super("实验八多线程 文件复制进度条演示");
        this.setBounds(300,240,400,300);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);

        this.setLayout(new GridLayout(4,1));

        JButton jb1 = new JButton();
        jb1.setText("确认");
        JButton jb2 = new JButton();
        jb2.setText("取消");
        if(jb2.isEnabled()){
            jb1.setEnabled(false);
        }
        if(jb1.isEnabled()){
            jb2.setEnabled(false);
        }
        this.add(jb1,BorderLayout.NORTH);
        this.add(jb2);

        JLabel jLabel= new JLabel();
        this.add(jLabel);
        jLabel.setText("文件复制0%");
        final int[] currentProgress = {0};
        final JProgressBar progressBar = new JProgressBar();
        final int MIN_PROGRESS = 0;
        final int MAX_PROGRESS = 100;
        Timer timer = new Timer(50, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                currentProgress[0]++;
                if (currentProgress[0] > MAX_PROGRESS) {
                    currentProgress[0] = MIN_PROGRESS;
                }
                jLabel.setText("文件复制"+currentProgress[0]+"%");
                progressBar.setValue(currentProgress[0]);
            }
        });

        jb1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                jb2.setEnabled(true);
                jb1.setEnabled(false);
                timer.start();
            }
        });
        jb2.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                jb1.setEnabled(true);
                jb2.setEnabled(false);
                currentProgress[0]=0;
                jLabel.setText("文件复制"+currentProgress[0]+"%");
                progressBar.setValue(currentProgress[0]);
                timer.start();
                timer.stop();

            }
        });


        progressBar.setMinimum(MIN_PROGRESS);
        progressBar.setMaximum(MAX_PROGRESS);
        progressBar.setStringPainted(true);

        progressBar.addChangeListener(new ChangeListener() {
            @Override
            public void stateChanged(ChangeEvent e) {
                System.out.println("当前进度值: " + progressBar.getValue() + "; " +
                        "进度百分比: " + progressBar.getPercentComplete());
            }
        });
        progressBar.setValue(currentProgress[0]);


        // 添加到内容面板
        this.add(progressBar);
        this.setVisible(true);
    }

    public static void main(String[] args) {
        new WelcomeJFrame();


        CopyFile cf1 = new CopyFile("C:\\Users\\hx\\Videos\\COPY\\hang1.txt", "C:\\Users\\hx\\Videos\\COPY\\hang2.txt");
        cf1.start();
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-11-18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档