(源码在上传的压缩包“【java学习记录】11.多线程实现阶乘计算(Thread类和Runnable接口)”中可看到,该压缩包可下载)java

* 采用Thread类的子类实现线程多线程 * 编写一多线程程序,实现以下功能:

* (1)一个线程进行阶乘和的运算(1!+2!+3!+… … +30!), 每次阶乘计算时间随机间隔0.5-1秒;

* (2)另外一个线程每隔1秒时间读取上个线程的运算结果和计算 进程,并在图形界面中实时显示结果。dom

ComputeThread

ide

public class ComputeThread extends Thread{//计算阶乘

double sum=0;//存储阶乘和

static int i=0;//存储阶乘和进度

static String stringSum="";//存储阶乘和的字符串

static String stringResult="";//存储阶乘结果的字符串

double method(int n){//计算阶乘

double result=1;//阶乘结果

for(int i=1;i<=n;i++){

result*=i;

}

return result;

}

@Override

public void run() {

// TODO Auto-generated method stub

while(i<30){//计算阶乘和

i++;

sum+=method(i);

stringResult=String.valueOf(sum);//将阶乘和存储到字符串中

if(i!=1){//显示阶乘和的过程:1!+2!+...+30!

stringSum=stringSum+"+"+i+"!";

}else{

stringSum=i+"!";

}

try{//0.5-1秒读取一次线程

Thread.sleep((int)(Math.random()*500+500));

}catch(InterruptedException ex){

}

}

}

}

布局

ReadThread

学习

public class ReadThread extends Thread{//读取阶乘

ThreadFrame tf;

ReadThread(ThreadFrame tf){//初始化

this.tf=tf;

}

@Override

public void run() {

// TODO Auto-generated method stub

while(true){

tf.textArea.setText(ComputeThread.stringSum);//将阶乘和的过程显示到文本域中

tf.textFile.setText(ComputeThread.stringResult);//将阶乘和结果显示到文本框中

tf.jpb.setValue(ComputeThread.i);//在面板上的进度条中显示计算进度

try{

Thread.sleep(100);//0.1秒读取一次线程

}catch (Exception e) {

// TODO: handle exception

}

}

}

}

测试

ThreadFrame

字体

public class ThreadFrame implements ActionListener{//建立面板

JFrame jframe;//建立窗体

Panel panel;//建立面板

Label label_title;//建立标签

Label label_1;

Label label_2;

Label label_3;

TextField textFile;//建立文本框

TextArea textArea;//建立文本域

Button btn;//建立按钮

JProgressBar jpb;//建立进度条

ThreadFrame(){

//建立窗体

jframe=new JFrame("线程");//设置窗体名称

jframe.setBounds(600, 100, 400, 400);//设置大小

jframe.setVisible(true);//设置课件

jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//结束进程

//建立面板

panel=new Panel();

panel.setBackground(Color.white);//设置背景颜色

panel.setLayout(null);//取消默认布局

jframe.add(panel);

//建立标签

label_title=new Label("多线程实验");

label_1=new Label("计算线程:");

label_2=new Label("计算进度:");

label_3=new Label("计算读取:");

label_title.setBounds(jframe.size().width/2-50, 10, 100, 50);

label_1.setBounds(30, 100, 60, 20);

label_2.setBounds(30, 160, 60, 20);

label_3.setBounds(30, 220, 60, 20);

label_title.setFont(new Font("宋体", 1, 16));//设置字体

panel.add(label_title);

panel.add(label_1);

panel.add(label_2);

panel.add(label_3);

//建立文本域

textArea=new TextArea();

textArea.setBounds(100, 80, 200, 60);

textArea.setEditable(false);//不可编辑

panel.add(textArea);

//建立单行文本框

textFile=new TextField("0");

textFile.setBounds(textArea.getX(), 220, textArea.size().width, 20);

textFile.setEditable(false);//不可编辑

panel.add(textFile);

//建立按钮

btn=new Button("开始计算");

btn.setBounds(jframe.size().width/2-35, 270, 70, 30);

panel.add(btn);

btn.addActionListener(this);//添加监听器

//建立进度条

jpb=new JProgressBar();

jpb.setBounds(textArea.getX(), textArea.getY()+textArea.size().height+10, textArea.size().width, 40);

jpb.setMaximum(30);//设置最大值

panel.add(jpb);

}

@Override

public void actionPerformed(ActionEvent e) {//按钮点击事件

// TODO Auto-generated method stub

//调用计算线程

ComputeThread ct=new ComputeThread();

Thread tc=new Thread(ct);

//调用读取线程

ReadThread rt=new ReadThread(this);

Thread tr=new Thread(rt);

//开始线程

tc.start();

tr.start();

}

}

this

TestThread 测试类

spa

public class TestThread extends Thread{

public static void main(String[] args) {

ThreadFrame tf=new ThreadFrame();

}

}

b047a18dc31725b05b91937b28da63e5.png

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐