這次比較特別,因為老師出的功課中,有一個計算若是用整數資料形態,會發生溢位的問題,事後詢問老師,對此有三種解決方式,以下會為大家說明一下。
貼上執行結果:
T1:1
T1:3
T2:100
T2:99
T2:98
T2:97
T2:96
T1:6
T1:10
T1:15
T1:21
...省略
T3:2.0
T3:8.0
...省略
T3:48.0
T3:384.0
...省略
T2:0
T1:903
T1:5050
T3:3.4942066022971404E75
T3:3.4243224702511974E77
T3:3.4243224702511973E79
大家可以注意第三個執行緒的程式碼,老師提供三種解決方式:
1.將int改成用double宣告。
2.將溢位視為Exception,當溢位時顯示訊息。
3.改成用BigInteger類別來包覆變數,利用類別方法multiply來計算乘積。
寫法僅供參考,畢竟Java才學了半年左右吧 >”<
(大家記得註解和程式碼要自己重新打過唷,工讀生會檢查)
底下依序貼上方法一、二、三:
public class s11967046 { /*請以今天3/16課堂中所學範例,試撰寫一java程式, * 建立三個執行緒,並同時執行之。 * 1.第一個執行緒執行1-100的加總動作。 * 2.第二個執行緒執行100至1的遞減動作。 * 3.第三個執行緒執行計算1-100中偶數相乘。 * 須輸出每一執行步驟,例如1-100加總: 1 3 6 10 ... * 注意:以學號為主程式命名。 * */ public static void main(String[] args) { //宣告三個執行緒,並且給它們取名 thread1 t1 = new thread1("T1"); thread2 t2 = new thread2("T2"); thread3 t3 = new thread3("T3"); //啟動三個執行緒 t1.start(); t2.start(); t3.start(); } } //執行1-100的加總動作。 class thread1 extends Thread{ int sum; //宣告儲存結果的變數 //建構子呼叫父類別的建構子,功能是替執行緒取名 public thread1(String name){ super (name); } //覆寫run方法 public void run(){ for (int i =1 ; i<=100;i++){ sum+=i; //相加後的結果儲存於sum中 //顯示執行緒的名字和sum結果 System.out.println(Thread.currentThread().getName() + ":" + sum); } } } //執行100至1的遞減動作。 class thread2 extends Thread{ //建構子呼叫父類別的建構子,功能是替執行緒取名 public thread2(String name){ super (name); } //覆寫run方法 public void run(){ for (int i = 100 ; i >= 0;i--){ //顯示執行緒的名字和i System.out.println(Thread.currentThread().getName() + ":" + i); } } } //執行計算1-100中偶數相乘。 class thread3 extends Thread{ double sum = 1; //宣告儲存結果的變數 //建構子呼叫父類別的建構子,功能是替執行緒取名 public thread3(String name){ super (name); } //覆寫run方法 public void run(){ for (int i =1 ; i<=100;i++){ //將1-100中是偶數的數字篩選出來 if (i%2 == 0){ //計算乘積 sum*=i; //顯示執行緒的名字和big結果 System.out.println(Thread.currentThread().getName() + ":" + sum ); } } } }
方法二:
//執行計算1-100中偶數相乘。 class thread3 extends Thread{ int sum = 1; //宣告儲存結果的變數 //建構子呼叫父類別的建構子,功能是替執行緒取名 public thread3(String name){ super (name); } //覆寫run方法 public void run(){ try{ for (int i =1 ; i<=100;i++){ //將1-100中是偶數的數字篩選出來 if (i%2 == 0){ //計算乘積 sum*=i; //顯示執行緒的名字和sun結果 System.out.println(Thread.currentThread().getName() + ":" + sum ); } //當sum出現負數,表示溢位了 if(sum < 0){ //利用throw丟出ArithmeticException throw new ArithmeticException(); } } }catch(ArithmeticException e){ System.out.println("真抱歉,sum已經溢位了"); } } }
方法三:
import java.math.BigInteger; //記得import這個類別 //執行計算1-100中偶數相乘。 class thread3 extends Thread{ int sum = 1; //宣告儲存結果的變數 //將sum放入新建立的BigInteger物件中,以方便儲存大量的數字 BigInteger big = new BigInteger(Integer.toString(sum)); BigInteger big2 = null; //宣告big2先指向空的指標 //建構子呼叫父類別的建構子,功能是替執行緒取名 public thread3(String name){ super (name); } //覆寫run方法 public void run(){ for (int i =1 ; i<=100;i++){ //將1-100中是偶數的數字篩選出來 if (i%2 == 0){ //將偶數放入big2物件中,用於和big相乘 big2= new BigInteger(Integer.toString(i)); //相乘後的乘積儲存與big big = big.multiply(big2); //顯示執行緒的名字和big結果 System.out.println(Thread.currentThread().getName() + ":" + big ); } } } }
沒有留言:
張貼留言
歡迎提供良性建議^_^