多线程矩阵乘法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
import java.awt.*;
import ng.reflect.Array;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.event.*;
public class MatrixMultiply extends JFrame implements ActionListener{ private JButton jbtOk = new JButton("确定");
private JButton jbtCancel = new JButton("重置");
private JTextField jtf_1 = new JTextField(4);
private JTextField jtf_2 = new JTextField(4);
private JTextField jtf_3 = new JTextField(4);
private JTextField jtf_4 = new JTextField(4);
JTable jta1 = new JTable(10, 10);
JTable jta2 = new JTable(10, 10);
JTable jta3 = new JTable(10, 10);
static Scanner input = new Scanner(System.in);
//用ArrayList创建三个动态数组
static ArrayList<ArrayList> matrix_1, matrix_2, matrix_3;
//声明四个变量,分别用来表示矩阵的行数、列数
static int rows_1, rows_2, columns_1, columns_2;
public MatrixMultiply(){
JPanel p1 = new JPanel(new FlowLayout(1, 5, 0));
JPanel p2 = new JPanel(new FlowLayout(1, 5, 0));
JPanel p3 = new JPanel(new FlowLayout(1, 20, 0));
JPanel p4 = new JPanel(new FlowLayout(1, 50, 0));
JPanel p5 = new JPanel();
JPanel p6 = new JPanel();
JPanel p7 = new JPanel();
JPanel p8 = new JPanel(new GridLayout(3, 1, 0, 0));
JPanel p9 = new JPanel();
p1.add(new JLabel("行数:"));
p1.add(jtf_1);
p1.add(new JLabel("列数:"));
p1.add(jtf_2);
p1.setBorder(new TitledBorder("矩阵1"));
p2.add(new JLabel("行数:"));
p2.add(jtf_3);
p2.add(new JLabel("列数:"));
p2.add(jtf_4);
p2.setBorder(new TitledBorder("矩阵2"));
p3.add(jbtOk);
p3.add(jbtCancel);
p3.setBorder(new TitledBorder(""));
p4.add(p1);
p4.add(p2);
p4.add(p3);
p4.setBorder(new TitledBorder("请输入矩阵的列数和行数"));
p5.add(jta1);
p5.setBorder(new TitledBorder("矩阵1"));
p6.add(jta2);
p6.setBorder(new TitledBorder("矩阵2"));
p7.add(jta3);
p7.setBorder(new TitledBorder("矩阵3"));
p8.add(p5);
p8.add(p6);
p8.add(p7);
setLayout(new BorderLayout(2, 1));
add(p4, BorderLayout.NORTH);
add(p8, BorderLayout.CENTER);
//事件监听
jbtOk.addActionListener(this);
jbtCancel.addActionListener(this);
}
public void actionPerformed(ActionEvent e){
if (e.getSource() == jbtOk){
//从文本框获取输入值
rows_1 = Integer.parseInt(jtf_1.getText());
columns_1 = Integer.parseInt(jtf_2.getText());
rows_2 = Integer.parseInt(jtf_3.getText());
columns_2 = Integer.parseInt(jtf_4.getText());
if (columns_1 != rows_2){
JOptionPane.showMessageDialog(null, "请重新输入(第一个矩阵的行数要与第二个矩阵的列数相等)!",
"Opps, you are wrong!", RMATION_MESSAGE);
jtf_1.setText("");
jtf_2.setText("");
jtf_3.setText("");
jtf_4.setText("");
}
if (rows_1 > 10 || columns_1 > 10 || rows_2 > 10 || columns_2 > 10) { JOptionPane.showMessageDialog(null, "请输入10以内的整数",
"Opps, you are wrong!", RMATION_MESSAGE);
}
matrix_1 = createArray(rows_1, columns_1);
matrix_2 = createArray(rows_2, columns_2);
reset(1);
displayArray(matrix_1, 1);
reset(2);
displayArray(matrix_2, 2);
matrix_3 = new ArrayList<ArrayList>();
//创建类的一个对象,用来实现多线程
MatrixMultiply multiply = new MatrixMultiply();
//实现多线程
for (int i = 0; i < rows_1; i++){
//调用start()方法激活多线程中的run()方法
multiply.new MultiplyThread(i).start();
}
//输出Matrix_3
reset(3);
displayArray(matrix_3, 3);
}
if (e.getSource() == jbtCancel){
jtf_1.setText("");
jtf_2.setText("");
jtf_3.setText("");
jtf_4.setText("");
reset(1);
reset(2);
reset(3);
}
}
//创建动态数组,返回ArrayList类型数组
public static ArrayList createArray(int rows, int columns){
//声明并创建一个动态数组
ArrayList matrix = new ArrayList();
for (int i = 0; i < rows; i++){
//声明并创建一个临时数组
ArrayList temp = new ArrayList();
for (int j = 0; j < columns; j++){
//调用random()方法给临时动态数组赋值,其值为10以内整数
temp.add((int)(Math.random() * 10));
}
//将temp添加到matrix
matrix.add(temp);
}
return matrix;
}
//输出动态数组
public void displayArray(ArrayList<ArrayList> arrays, int num){
//用setValueAt()方法将数组元素添加到JTable
//setValueAt()的第二个和第三个参数用来确定位置
//调用size()方法获得动态数组的行数
System.out.println("The matirx is: ");
for (int i = 0; i < arrays.size(); i++){
//调用get()方法获得数组的行元素,并将其输出
System.out.println(arrays.get(i));
for (int j = 0; j < (arrays.get(0)).size(); j++){
if (num == 1){
jta1.setValueAt((arrays.get(i)).get(j), i, j);
}
else if (num == 2){
jta2.setValueAt((arrays.get(i)).get(j), i, j);
}
else if (num == 3){
jta3.setValueAt((arrays.get(i)).get(j), i, j);
}
}
}
}
//重置JTable
public void reset(int num) {
if (num == 1) {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++)
jta1.setValueAt("", i, j);
}
}
if (num == 2){
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++)
jta2.setValueAt("", i, j);
}
}
if (num == 3) {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++)
jta3.setValueAt("", i, j);
}
}
}
//创建Thread类的子类MultiplyThread,用来实现矩阵乘法多线程class MultiplyThread extends Thread{
//表示矩阵Matrix_3的行数
int row = 0;
//用构造方法对row赋值
public MultiplyThread(int row){
this.row = row;
}
//覆盖Thread类的run()方法,实现矩阵乘法运算
public void run(){
//创建一个临时的动态数组,用来存放矩阵Matrix_3的行元素
ArrayList tempArray = new ArrayList();
//用两个for循环实现矩阵乘法
//外层for循环用来控制Matrix_2的列数
//内层for循环用来控制Matrix_1的列数和Matrix_2的行数
for (int i = 0; i < (matrix_2.get(0)).size(); i++){
//创建两个临时变量,temp用来计算两个矩阵对应行与列上元素的和,
//product用来计算对应行与列上元素的乘积
int temp = 0, product = 0;
for (int j = 0; j < matrix_2.size(); j++){
product = (int)(matrix_1.get(row)).get(j) *
(int)(matrix_2.get(j)).get(i);
temp += product;
}
//将temp添加到动态数组tempArray
tempArray.add(temp);
}
//将tempArray添加到Matrix_3
matrix_3.add(tempArray);
}
}
public static void main(String[] args){
///创建frame框架
JFrame frame = new MatrixMultiply();
frame.setTitle("矩阵乘法");
frame.setSize(780, 700);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}。