【Java多執行緒】使用多執行緒計算階乘累加 1!+2!+3!+...+19!+20!。其中一個執行緒計算階乘,另一執行緒實現累加並輸出結果
阿新 • • 發佈:2020-11-24
(如發現問題,請幫忙指出,謝謝)使用多執行緒計算階乘累加 1!+2!+3!+…+19!+20!。其中一個執行緒計算階乘,另一執行緒實現累加並輸出結果。
class Info{
double sum=1;
double count =0;
private boolean flag=false;
double count1;
public synchronized void set(double sum){
if(!flag){
try{
super.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
this.setSum(sum);
try{
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
this.setCount(count);
flag=false;
super .notify();
}
public synchronized void get(double count){
if(flag){
try{
super.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
try{
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
flag=true;
super.notify();
}
public double getCount() {
return count;
}
public void setCount(double count) {
this.count = count;
}
public void setSum(double sum) {
this.sum = sum;
}
public double getSum() {
return sum;
}
}
class Producer implements Runnable {
private Info info = null;
public Producer(Info info) {
this.info = info;
}
@Override
public void run() {
int i;
boolean flag = true;
if (flag) {
for (i = 1; i <= 20; i++) {
try {
this.info.sum=1;
for (int j = 1; j <= i; j++) {
this.info.sum *= j;
if(i==20){
this.info.count1=this.info.sum;
}
}
Thread.sleep(90);
System.out.println(i + "!為" + this.info.sum);
this.info.set(this.info.sum);
}catch (InterruptedException e) {
e.printStackTrace();
}
}
flag=true;
}else {
try{
Thread.sleep(90);
} catch (InterruptedException e) {
e.printStackTrace();
}
flag=false;
}
}
}
class Consumer implements Runnable{
private Info info=null;
private double count1=0;
public Consumer(Info info){
this.info=info;
}
@Override
public void run() {
for(int i=1;i<=20;i++){
try{
Thread.sleep(100);
this.info.count+=this.info.sum;
this.info.get(this.info.count);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("計算結果為:"+(this.info.count+this.info.count1));
}
}
public class TestX {
public static void main(String args[]){
Info i=new Info();
Producer pro=new Producer(i);
Consumer con=new Consumer(i);
new Thread(pro).start();
new Thread(con).start();
}
}