201771010126 王燕《面向对象程序设计(Java)》第十六周学习总结
實驗十六??線程技術
實驗時間?2017-12-8
1、實驗目的與要求
(1)?掌握線程概念;
‐多線程 是進程執行過中產生的多條線索。 是進程執行過中產生的多條線索。 是進程執行過中產生的多條線索。 是進程執行過中產生的多條線索。
‐線程是比進執行更小的單位。
‐線程不能獨立存在,必須于進 中同一線程不能獨立存在,必須于進 中同一線程不能獨立存在,必須于進 中同一線程不能獨立存在,必須于進 中同一程的各線間共享進空數據。 程的各線間共享進空數據。
‐每個線程有它自身的產生、存在和消亡過, 每個線程有它自身的產生、存在和消亡過, 每個線程有它自身的產生、存在和消亡過, 每個線程有它自身的產生、存在和消亡過, 是一個動態的概念。
‐多線程意味著一個序的行語句可以看上去幾 多線程意味著一個序的行語句可以看上去幾 多線程意味著一個序的行語句可以看上去幾 多線程意味著一個序的行語句可以看上去幾 乎在同一時間內運行。
‐線程創建、銷毀和切換的負荷遠小于進,又稱 線程創建、銷毀和切換的負荷遠小于進,又稱 線程創建、銷毀和切換的負荷遠小于進,又稱 線程創建、銷毀和切換的負荷遠小于進,又稱 為輕量級進程( lightweight process lightweight process lightweight process )。
(2)?掌握線程創建的兩種技術;
Java 實現多線程有兩種途徑:
‐創建 Thread 類的子
首先需從 Thread 類派生出一個子, 在該子類中 重寫 run() 方法。
例:
class class hand extends Thread hand extends Thread hand extends Threadhand extends Thread hand extends Thread hand extends Thread hand extends Thread hand extends Thread hand extends Thread ?????? hand extends Thread
{
public void run() public void run() public void run() public void run() public void run()
{……} {……}
}
然后用創建該子類的對象
Lefthand left=new Lefthand ();
Righthand right=new Righthand ();
. 最后用 start() 方法啟動線程
left.start ();
right.start ();
‐在程序中定義實現 Runnable 接口的類
首先設計一個實現 Runnable Runnable 接口的類; 接口的類; 接口的類; 接口的類; 接口的類;
. 然后在類中根據需要重寫 run 方法;
. 再創建該類對象,以此為參數立 再創建該類對象,以此為參數立 ThreadThread Thread類的對象;
. 調用 Thread Thread Thread 類對象的 start start start方法啟動線程,將 方法啟動線程,將 方法啟動線程,將 方法啟動線程,將 方法啟動線程,將 方法啟動線程,將 方法啟動線程,將 方法啟動線程,將 CPU 執 ????????? 行權轉交到 run 方法。 方法。 方法。
用Runnable() (見教材 (見教材 (見教材 632 頁) 接口實現線程 接口實現線程 接口實現線程 接口實現線
(3)?理解和掌握線程的優先級屬性及調度方法;
Java 提供一個 線程調度器 來監控程序啟動后進入 來監控程序啟動后進入 來監控程序啟動后進入 來監控程序啟動后進入 來監控程序啟動后進入 來監控程序啟動后進入 來監控程序啟動后進入 來監控程序啟動后進入 ?????? 監控程序啟動后進入 來監控程序啟動后進入 可運行狀態的 所有線程。調度器按照可運行狀態的 所有線程。調度器按照可運行狀態的 所有線程。調度器按照可運行狀態的 所有線程。調度器按照優先級決定應調?????? 度 哪些線程來執行。 優先級決定應調度哪些線程來執行。
– 處于可運行狀態的線程首先進入 就緒隊 列排就緒隊 列排就緒隊 列排就緒隊 列排就緒隊 列排就緒隊 列排等 候處理器資源,同一時刻在就緒隊列中的線程可 候處理器資源,同一時刻在就緒隊列中的線程可 候處理器資源,同一時刻在就緒隊列中的線程可 候處理器資源,同一時刻在就緒隊列中的線程可 能有多個。 Java 的多線程系統會給每個自動 的多線程系統會給每個自動 的多線程系統會給每個自動 的多線程系統會給每個自動 的多線程系統會給每個自動 的多線程系統會給每個自動 的多線程系統會給每個自動 的多線程系統會給每個自動 的多線程系統會給每個自動 的多線程系統會給每個自動 的多線程系統會給每個自動 的多線程系統會給每個自動 的多線程系統會給每個自動 的多線程系統會給每個自動 分配一個線程的優先級。
Java 的線程調度采用優先級策略 :
? 優先級高的執行,低后;
? 多線程系統會自動為每個分配一優先級,缺省時,繼承其父類的優先級;
? 任務緊急的線程,其優先級較高;
? 同優先級的線程按“進出”隊列原則;
多線程調度
(4)?掌握線程同步的概念及實現技術;
多線程并發運行不確定性問題解決方案: 多線程并發運行不確定性問題解決方案: 多線程并發運行不確定性問題解決方案: 多線程并發運行不確定性問題解決方案: 多線程并發運行不確定性問題解決方案: 多線程并發運行不確定性問題解決方案: 多線程并發運行不確定性問題解決方案: 多線程并發運行不確定性問題解決方案: 多線程并發運行不確定性問題解決方案: 多線程并發運行不確定性問題解決方案: 多線程并發運行不確定性問題解決方案: 多線程并發運行不確定性問題解決方案: 多線程并發運行不確定性問題解決方案: 多線程并發運行不確定性問題解決方案: 多線程并發運行不確定性問題解決方案: 多線程并發運行不確定性問題解決方案: 多線程并發運行不確定性問題解決方案: 多線程并發運行不確定性問題解決方案: 引入線 引入線 引入線 程同步機制 程同步機制 程同步機制 程同步機制 程同步機制 ,使得另一線程要用該方法 使得另一線程要用該方法 使得另一線程要用該方法 使得另一線程要用該方法 使得另一線程要用該方法 使得另一線程要用該方法 使得另一線程要用該方法 使得另一線程要用該方法 使得另一線程要用該方法 使得另一線程要用該方法 使得另一線程要用該方法 使得另一線程要用該方法 ,就只 能等待 。
? 在Java 中解決多線程同步問題 的方法有兩種: 的方法有兩種: 的方法有兩種: 的方法有兩種: 的方法有兩種: 的方法有兩種: 的方法有兩種:
-Java SE 5.0中引入 ReentrantLock ReentrantLock ReentrantLockReentrantLock ReentrantLock類(P 648648648頁)。
-在共享內存的類方法前加 在共享內存的類方法前加 在共享內存的類方法前加 在共享內存的類方法前加 在共享內存的類方法前加 在共享內存的類方法前加 在共享內存的類方法前加 在共享內存的類方法前加 在共享內存的類方法前加 在共享內存的類方法前加 在共享內存的類方法前加 synchronizedsynchronizedsynchronized synchronized synchronized synchronizedsynchronized修飾符 修飾符 修飾符 。
2、實驗內容和步驟
實驗1:測試程序并進行代碼注釋。
測試程序1:
l?在elipse?IDE中調試運行ThreadTest,結合程序運行結果理解程序;
l?掌握線程概念;
l?掌握用Thread的擴展類實現線程的方法;
l?利用Runnable接口改造程序,掌握用Runnable接口創建線程的方法。
| class?Lefthand?extends?Thread?{? ???public?void?run() ???{ ???????for(int?i=0;i<=5;i++) ???????{??System.out.println("You?are?Students!"); ???????????try{???sleep(500);???} ???????????catch(InterruptedException?e) ???????????{?System.out.println("Lefthand?error.");}???? ???????}? ??}? } class?Righthand?extends?Thread?{ ????public?void?run() ????{ ?????????for(int?i=0;i<=5;i++) ?????????{???System.out.println("I?am?a?Teacher!"); ?????????????try{??sleep(300);??} ?????????????catch(InterruptedException?e) ?????????????{?System.out.println("Righthand?error.");} ?????????} ????} } public?class?ThreadTest? { ?????static?Lefthand?left; ?????static?Righthand?right; ?????public?static?void?main(String[]?args) ?????{?????left=new?Lefthand(); ???????????right=new?Righthand(); ???????????left.start(); ???????????right.start(); ?????} } |
?
1 package test; 2 3 class Lefthand extends Thread { 4 public void run() 5 { 6 for(int i=0;i<=5;i++) 7 { System.out.println("You are Students!"); 8 try{ sleep(500); } 9 catch(InterruptedException e) 10 { System.out.println("Lefthand error.");} 11 } 12 } 13 } 14 class Righthand extends Thread { 15 public void run() 16 { 17 for(int i=0;i<=5;i++) 18 { System.out.println("I am a Teacher!"); 19 try{ sleep(300); } 20 catch(InterruptedException e) 21 { System.out.println("Righthand error.");} 22 } 23 } 24 } 25 public class ThreadTest 26 { 27 static Lefthand left; 28 static Righthand right; 29 public static void main(String[] args) 30 { Runnable left1 = new Lefthand(); 31 Runnable right1 = new Righthand() ; 32 Thread left = new Thread(left1); 33 Thread right = new Thread(right1); 34 left.start(); 35 right.start(); 36 37 } 38 } View Code?
測試程序2:
l?在Elipse環境下調試教材625頁程序14-1、14-2?、14-3,結合程序運行結果理解程序;
l?在Elipse環境下調試教材631頁程序14-4,結合程序運行結果理解程序;
l?對比兩個程序,理解線程的概念和用途;
l?掌握線程創建的兩種技術。
?
1 package bounce; 2 3 import java.awt.geom.*; 4 5 /** 6 * A ball that moves and bounces off the edges of a rectangle 7 * @version 1.33 2007-05-17 8 * @author Cay Horstmann 9 */ 10 public class Ball 11 { 12 private static final int XSIZE = 15; 13 private static final int YSIZE = 15; 14 private double x = 0; 15 private double y = 0; 16 private double dx = 1; 17 private double dy = 1; 18 19 /** 20 * Moves the ball to the next position, reversing direction if it hits one of the edges 21 */ 22 public void move(Rectangle2D bounds) 23 { 24 x += dx; 25 y += dy; 26 if (x < bounds.getMinX()) 27 { 28 x = bounds.getMinX(); 29 dx = -dx; 30 } 31 if (x + XSIZE >= bounds.getMaxX()) 32 { 33 x = bounds.getMaxX() - XSIZE; 34 dx = -dx; 35 } 36 if (y < bounds.getMinY()) 37 { 38 y = bounds.getMinY(); 39 dy = -dy; 40 } 41 if (y + YSIZE >= bounds.getMaxY()) 42 { 43 y = bounds.getMaxY() - YSIZE; 44 dy = -dy; 45 } 46 } 47 48 /** 49 * Gets the shape of the ball at its current position. 50 */ 51 public Ellipse2D getShape() 52 { 53 return new Ellipse2D.Double(x, y, XSIZE, YSIZE); 54 } 55 } View Code 1 package bounce; 2 3 import java.awt.*; 4 import java.util.*; 5 import javax.swing.*; 6 7 /** 8 * The component that draws the balls. 9 * @version 1.34 2012-01-26 10 * @author Cay Horstmann 11 */ 12 public class BallComponent extends JPanel 13 { 14 private static final int DEFAULT_WIDTH = 450; 15 private static final int DEFAULT_HEIGHT = 350; 16 17 private java.util.List<Ball> balls = new ArrayList<>(); 18 19 /** 20 * Add a ball to the component. 21 * @param b the ball to add 22 */ 23 public void add(Ball b) 24 { 25 balls.add(b); 26 } 27 28 public void paintComponent(Graphics g) 29 { 30 super.paintComponent(g); // erase background 31 Graphics2D g2 = (Graphics2D) g; 32 for (Ball b : balls) 33 { 34 g2.fill(b.getShape()); 35 } 36 } 37 38 public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); } 39 } View Code 1 package bounce; 2 3 import java.awt.*; 4 import java.awt.event.*; 5 import javax.swing.*; 6 7 /** 8 * Shows an animated bouncing ball. 9 * @version 1.34 2015-06-21 10 * @author Cay Horstmann 11 */ 12 public class Bounce 13 { 14 public static void main(String[] args) 15 { 16 EventQueue.invokeLater(() -> { 17 JFrame frame = new BounceFrame(); 18 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 19 frame.setVisible(true); 20 }); 21 } 22 } 23 24 /** 25 * The frame with ball component and buttons. 26 */ 27 class BounceFrame extends JFrame 28 { 29 private BallComponent comp; 30 public static final int STEPS = 1000; 31 public static final int DELAY = 3; 32 33 /** 34 * Constructs the frame with the component for showing the bouncing ball and 35 * Start and Close buttons 36 */ 37 public BounceFrame() 38 { 39 setTitle("Bounce"); 40 comp = new BallComponent(); 41 add(comp, BorderLayout.CENTER); 42 JPanel buttonPanel = new JPanel(); 43 addButton(buttonPanel, "Start", event -> addBall()); 44 addButton(buttonPanel, "Close", event -> System.exit(0)); 45 add(buttonPanel, BorderLayout.SOUTH); 46 pack(); 47 } 48 49 /** 50 * Adds a button to a container. 51 * @param c the container 52 * @param title the button title 53 * @param listener the action listener for the button 54 */ 55 public void addButton(Container c, String title, ActionListener listener) 56 { 57 JButton button = new JButton(title); 58 c.add(button); 59 button.addActionListener(listener); 60 } 61 62 /** 63 * Adds a bouncing ball to the panel and makes it bounce 1,000 times. 64 */ 65 public void addBall() 66 { 67 try 68 { 69 Ball ball = new Ball(); 70 comp.add(ball); 71 72 for (int i = 1; i <= STEPS; i++) 73 { 74 ball.move(comp.getBounds()); 75 comp.paint(comp.getGraphics()); 76 Thread.sleep(DELAY); 77 } 78 } 79 catch (InterruptedException e) 80 { 81 } 82 } 83 } View Code?
1 package bounceThread; 2 3 import java.awt.geom.*; 4 5 /** 6 A ball that moves and bounces off the edges of a 7 rectangle 8 * @version 1.33 2007-05-17 9 * @author Cay Horstmann 10 */ 11 public class Ball 12 { 13 private static final int XSIZE = 15; 14 private static final int YSIZE = 15; 15 private double x = 0; 16 private double y = 0; 17 private double dx = 1; 18 private double dy = 1; 19 20 /** 21 Moves the ball to the next position, reversing direction 22 if it hits one of the edges 23 */ 24 public void move(Rectangle2D bounds) 25 { 26 x += dx; 27 y += dy; 28 if (x < bounds.getMinX()) 29 { 30 x = bounds.getMinX(); 31 dx = -dx; 32 } 33 if (x + XSIZE >= bounds.getMaxX()) 34 { 35 x = bounds.getMaxX() - XSIZE; 36 dx = -dx; 37 } 38 if (y < bounds.getMinY()) 39 { 40 y = bounds.getMinY(); 41 dy = -dy; 42 } 43 if (y + YSIZE >= bounds.getMaxY()) 44 { 45 y = bounds.getMaxY() - YSIZE; 46 dy = -dy; 47 } 48 } 49 50 /** 51 Gets the shape of the ball at its current position. 52 */ 53 public Ellipse2D getShape() 54 { 55 return new Ellipse2D.Double(x, y, XSIZE, YSIZE); 56 } 57 } View Code 1 package bounceThread; 2 3 import java.awt.*; 4 import java.util.*; 5 import javax.swing.*; 6 7 /** 8 * The component that draws the balls. 9 * @version 1.34 2012-01-26 10 * @author Cay Horstmann 11 */ 12 public class BallComponent extends JComponent 13 { 14 private static final int DEFAULT_WIDTH = 450; 15 private static final int DEFAULT_HEIGHT = 350; 16 17 private java.util.List<Ball> balls = new ArrayList<>(); 18 19 /** 20 * Add a ball to the panel. 21 * @param b the ball to add 22 */ 23 public void add(Ball b) 24 { 25 balls.add(b); 26 } 27 28 public void paintComponent(Graphics g) 29 { 30 Graphics2D g2 = (Graphics2D) g; 31 for (Ball b : balls) 32 { 33 g2.fill(b.getShape()); 34 } 35 } 36 37 public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); } 38 } View Code 1 package bounceThread; 2 3 import java.awt.*; 4 import java.awt.event.*; 5 6 import javax.swing.*; 7 8 /** 9 * Shows animated bouncing balls. 10 * @version 1.34 2015-06-21 11 * @author Cay Horstmann 12 */ 13 public class BounceThread 14 { 15 public static void main(String[] args) 16 { 17 EventQueue.invokeLater(() -> { 18 JFrame frame = new BounceFrame(); 19 frame.setTitle("BounceThread"); 20 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 21 frame.setVisible(true); 22 }); 23 } 24 } 25 26 /** 27 * The frame with panel and buttons. 28 */ 29 class BounceFrame extends JFrame 30 { 31 private BallComponent comp; 32 public static final int STEPS = 1000; 33 public static final int DELAY = 5; 34 35 36 /** 37 * Constructs the frame with the component for showing the bouncing ball and 38 * Start and Close buttons 39 */ 40 public BounceFrame() 41 { 42 comp = new BallComponent(); 43 add(comp, BorderLayout.CENTER); 44 JPanel buttonPanel = new JPanel(); 45 addButton(buttonPanel, "Start", event -> addBall()); 46 addButton(buttonPanel, "Close", event -> System.exit(0)); 47 add(buttonPanel, BorderLayout.SOUTH); 48 pack(); 49 } 50 51 /** 52 * Adds a button to a container. 53 * @param c the container 54 * @param title the button title 55 * @param listener the action listener for the button 56 */ 57 public void addButton(Container c, String title, ActionListener listener) 58 { 59 JButton button = new JButton(title); 60 c.add(button); 61 button.addActionListener(listener); 62 } 63 64 /** 65 * Adds a bouncing ball to the canvas and starts a thread to make it bounce 66 */ 67 public void addBall() 68 { 69 Ball ball = new Ball(); 70 comp.add(ball); 71 Runnable r = () -> { 72 try 73 { 74 for (int i = 1; i <= STEPS; i++) 75 { 76 ball.move(comp.getBounds()); 77 comp.repaint(); 78 Thread.sleep(DELAY); 79 } 80 } 81 catch (InterruptedException e) 82 { 83 } 84 }; 85 Thread t = new Thread(r); 86 t.start(); 87 } 88 } View Code?
?測試程序3:分析以下程序運行結果并理解程序。
| class?Race?extends?Thread?{ ??public?static?void?main(String?args[])?{ ????Race[]?runner=new?Race[4]; ????for(int?i=0;i<4;i++)?runner[i]=new?Race(?); ???for(int?i=0;i<4;i++)?runner[i].start(?); ???runner[1].setPriority(MIN_PRIORITY); ???runner[3].setPriority(MAX_PRIORITY);} ??public?void?run(?)?{ ??????for(int?i=0;?i<1000000;?i++); ??????System.out.println(getName()+"線程的優先級是"+getPriority()+"已計算完畢!"); ????} } |
?
?
測試程序4
l?教材642頁程序模擬一個有若干賬戶的銀行,隨機地生成在這些賬戶之間轉移錢款的交易。每一個賬戶有一個線程。在每一筆交易中,會從線程所服務的賬戶中隨機轉移一定數目的錢款到另一個隨機賬戶。
l?在Elipse環境下調試教材642頁程序14-5、14-6,結合程序運行結果理解程序;
1 package unsynch; 2 3 import java.util.*; 4 5 /** 6 * A bank with a number of bank accounts. 7 * @version 1.30 2004-08-01 8 * @author Cay Horstmann 9 */ 10 public class Bank 11 { 12 private final double[] accounts; 13 14 /** 15 * Constructs the bank. 16 * @param n the number of accounts 17 * @param initialBalance the initial balance for each account 18 */ 19 public Bank(int n, double initialBalance) 20 { 21 accounts = new double[n]; 22 Arrays.fill(accounts, initialBalance); 23 } 24 25 /** 26 * Transfers money from one account to another. 27 * @param from the account to transfer from 28 * @param to the account to transfer to 29 * @param amount the amount to transfer 30 */ 31 public void transfer(int from, int to, double amount) 32 { 33 if (accounts[from] < amount) return; 34 System.out.print(Thread.currentThread()); 35 accounts[from] -= amount; 36 System.out.printf(" %10.2f from %d to %d", amount, from, to); 37 accounts[to] += amount; 38 System.out.printf(" Total Balance: %10.2f%n", getTotalBalance()); 39 } 40 41 /** 42 * Gets the sum of all account balances. 43 * @return the total balance 44 */ 45 public double getTotalBalance() 46 { 47 double sum = 0; 48 49 for (double a : accounts) 50 sum += a; 51 52 return sum; 53 } 54 55 /** 56 * Gets the number of accounts in the bank. 57 * @return the number of accounts 58 */ 59 public int size() 60 { 61 return accounts.length; 62 } 63 } View Code 1 package unsynch; 2 3 /** 4 * This program shows data corruption when multiple threads access a data structure. 5 * @version 1.31 2015-06-21 6 * @author Cay Horstmann 7 */ 8 public class UnsynchBankTest 9 { 10 public static final int NACCOUNTS = 100; 11 public static final double INITIAL_BALANCE = 1000; 12 public static final double MAX_AMOUNT = 1000; 13 public static final int DELAY = 10; 14 15 public static void main(String[] args) 16 { 17 Bank bank = new Bank(NACCOUNTS, INITIAL_BALANCE); 18 for (int i = 0; i < NACCOUNTS; i++) 19 { 20 int fromAccount = i; 21 Runnable r = () -> { 22 try 23 { 24 while (true) 25 { 26 int toAccount = (int) (bank.size() * Math.random()); 27 double amount = MAX_AMOUNT * Math.random(); 28 bank.transfer(fromAccount, toAccount, amount); 29 Thread.sleep((int) (DELAY * Math.random())); 30 } 31 } 32 catch (InterruptedException e) 33 { 34 } 35 }; 36 Thread t = new Thread(r); 37 t.start(); 38 } 39 } 40 } View Code綜合編程練習
編程練習1
(1)?用戶信息輸入界面如下圖所示:
??
(2)?用戶點擊提交按鈕時,用戶輸入信息顯示控制臺界面;
??
(3)?用戶點擊重置按鈕后,清空用戶已輸入信息;
?
(4)?點擊窗口關閉,程序退出。
2.創建兩個線程,每個線程按順序輸出5次“你好”,每個“你好”要標明來自哪個線程及其順序號。
1 package project2; 2 3 class Lefthand implements Runnable { 4 public void run() { 5 for (int i = 0; i < 5; i++) { 6 System.out.println(i + 1 + ":a.你好!"); 7 try { 8 Thread.sleep(500); 9 } catch (InterruptedException e) { 10 System.out.println("Lefthand error."); 11 } 12 } 13 } 14 } 15 16 class Righthand implements Runnable { 17 public void run() { 18 for (int i = 0; i < 5; i++) { 19 System.out.println(i + 1 + ":b.你好!"); 20 try { 21 Thread.sleep(300); 22 } catch (InterruptedException e) { 23 System.out.println("Righthand error."); 24 } 25 } 26 } 27 } 28 29 public class test { 30 public static void main(String[] args) { 31 Runnable left = new Lefthand(); 32 Thread l = new Thread(left); 33 Runnable right = new Righthand(); 34 Thread r = new Thread(right); 35 l.start(); 36 r.start(); 37 } 38 } View Code3.?完善實驗十五?GUI綜合編程練習程序。
練習一:
1 package project3; 2 3 public class Student implements Comparable<Student> { 4 5 private String name; 6 private String number ; 7 private String sex ; 8 private int age; 9 private String province; 10 11 public String getName() { 12 return name; 13 } 14 public void setName(String name) { 15 this.name = name; 16 } 17 public String getnumber() { 18 return number; 19 } 20 public void setnumber(String number) { 21 this.number = number; 22 } 23 public String getsex() { 24 return sex ; 25 } 26 public void setsex(String sex ) { 27 this.sex =sex ; 28 } 29 public int getage() { 30 31 return age; 32 } 33 public void setage(int age) { 34 // int a = Integer.parseInt(age); 35 this.age= age; 36 } 37 38 public String getprovince() { 39 return province; 40 } 41 public void setprovince(String province) { 42 this.province=province ; 43 } 44 45 public int compareTo(Student o) { 46 return this.name.compareTo(o.getName()); 47 } 48 49 public String toString() { 50 return name+"\t"+sex+"\t"+age+"\t"+number+"\t"+province+"\n"; 51 } 52 } View Code 1 package project3; 2 3 import java.io.BufferedReader; 4 import java.io.File; 5 import java.io.FileInputStream; 6 import java.io.InputStreamReader; 7 import java.io.FileNotFoundException; 8 import java.io.IOException; 9 import java.util.ArrayList; 10 import java.util.Arrays; 11 import java.util.Collections; 12 import java.util.Scanner; 13 import java.awt.*; 14 import javax.swing.*; 15 import java.awt.event.*; 16 17 public class Main extends JFrame { 18 private static ArrayList<Student> studentlist; 19 private static ArrayList<Student> list; 20 private JPanel panel; 21 private JPanel buttonPanel; 22 private static final int DEFAULT_WITH = 600; 23 private static final int DEFAULT_HEIGHT = 300; 24 25 public Main() { 26 studentlist = new ArrayList<>(); 27 Scanner scanner = new Scanner(System.in); 28 File file = new File("C:\\Users\\ASUS\\Desktop\\身份證號.txt"); 29 try { 30 FileInputStream fis = new FileInputStream(file); 31 BufferedReader in = new BufferedReader(new InputStreamReader(fis)); 32 String temp = null; 33 while ((temp = in.readLine()) != null) { 34 35 Scanner linescanner = new Scanner(temp); 36 37 linescanner.useDelimiter(" "); 38 String name = linescanner.next(); 39 String number = linescanner.next(); 40 String sex = linescanner.next(); 41 String age = linescanner.next(); 42 String province = linescanner.nextLine(); 43 Student student = new Student(); 44 student.setName(name); 45 student.setnumber(number); 46 student.setsex(sex); 47 int a = Integer.parseInt(age); 48 student.setage(a); 49 student.setprovince(province); 50 studentlist.add(student); 51 52 } 53 } catch (FileNotFoundException e) { 54 System.out.println("學生信息文件找不到"); 55 e.printStackTrace(); 56 } catch (IOException e) { 57 System.out.println("學生信息文件讀取錯誤"); 58 e.printStackTrace(); 59 } 60 panel = new JPanel(); 61 panel.setLayout(new BorderLayout()); 62 JTextArea jt = new JTextArea(); 63 panel.add(jt); 64 add(panel, BorderLayout.NORTH); 65 buttonPanel = new JPanel(); 66 buttonPanel.setLayout(new GridLayout(1, 7)); 67 JButton jButton = new JButton("字典排序"); 68 JButton jButton1 = new JButton("年齡最大和年齡最小"); 69 JLabel lab = new JLabel("猜猜你的老鄉"); 70 JTextField jt1 = new JTextField(); 71 JLabel lab1 = new JLabel("找找同齡人(年齡相近):"); 72 JTextField jt2 = new JTextField(); 73 JLabel lab2 = new JLabel("輸入你的身份證號碼:"); 74 JTextField jt3 = new JTextField(); 75 JButton jButton2 = new JButton("退出"); 76 jButton.setBounds(110, 90, 60, 30); 77 jButton1.setBounds(110, 90, 60, 30); 78 jt1.setBounds(110, 90, 60, 30); 79 jt2.setBounds(110, 90, 60, 30); 80 jt3.setBounds(110, 90, 60, 30); 81 jButton2.setBounds(110, 90, 60, 30); 82 jButton.addActionListener(new ActionListener() { 83 public void actionPerformed(ActionEvent e) { 84 Collections.sort(studentlist); 85 jt.setText(studentlist.toString()); 86 } 87 }); 88 jButton1.addActionListener(new ActionListener() { 89 public void actionPerformed(ActionEvent e) { 90 int max = 0, min = 100; 91 int j, k1 = 0, k2 = 0; 92 for (int i = 1; i < studentlist.size(); i++) { 93 j = studentlist.get(i).getage(); 94 if (j > max) { 95 max = j; 96 k1 = i; 97 } 98 if (j < min) { 99 min = j; 100 k2 = i; 101 } 102 103 } 104 jt.setText("年齡最大:" + studentlist.get(k1) + "年齡最小:" + studentlist.get(k2)); 105 } 106 }); 107 jButton2.addActionListener(new ActionListener() { 108 public void actionPerformed(ActionEvent e) { 109 dispose(); 110 System.exit(0); 111 } 112 }); 113 jt1.addActionListener(new ActionListener() { 114 public void actionPerformed(ActionEvent e) { 115 String find = jt1.getText(); 116 String text=""; 117 String place = find.substring(0, 3); 118 for (int i = 0; i < studentlist.size(); i++) { 119 if (studentlist.get(i).getprovince().substring(1, 4).equals(place)) { 120 text+="\n"+studentlist.get(i); 121 jt.setText("老鄉:" + text); 122 } 123 } 124 } 125 }); 126 jt2.addActionListener(new ActionListener() { 127 public void actionPerformed(ActionEvent e) { 128 String yourage = jt2.getText(); 129 int a = Integer.parseInt(yourage); 130 int near = agenear(a); 131 int value = a - studentlist.get(near).getage(); 132 jt.setText("年齡相近:" + studentlist.get(near)); 133 } 134 }); 135 jt3.addActionListener(new ActionListener() { 136 public void actionPerformed(ActionEvent e) { 137 list = new ArrayList<>(); 138 Collections.sort(studentlist); 139 String key = jt3.getText(); 140 for (int i = 1; i < studentlist.size(); i++) { 141 if (studentlist.get(i).getnumber().contains(key)) { 142 list.add(studentlist.get(i)); 143 jt.setText("emmm!你可能是:\n" + list); 144 //System.out.println("可能的人:" + studentlist.get(i)); 145 //jt.setText("可能的人:" + studentlist.get(i)); 146 } 147 } 148 } 149 }); 150 buttonPanel.add(jButton); 151 buttonPanel.add(jButton1); 152 buttonPanel.add(lab); 153 buttonPanel.add(jt1); 154 buttonPanel.add(lab1); 155 buttonPanel.add(jt2); 156 buttonPanel.add(lab2); 157 buttonPanel.add(jt3); 158 buttonPanel.add(jButton2); 159 add(buttonPanel, BorderLayout.SOUTH); 160 setSize(DEFAULT_WITH, DEFAULT_HEIGHT); 161 } 162 163 public static int agenear(int age) { 164 int min = 53, value = 0, k = 0; 165 for (int i = 0; i < studentlist.size(); i++) { 166 value = studentlist.get(i).getage() - age; 167 if (value < 0) 168 value = -value; 169 if (value < min) { 170 min = value; 171 k = i; 172 } 173 } 174 return k; 175 } 176 177 } View Code 1 package project3; 2 3 import java.awt.*; 4 import javax.swing.*; 5 6 public class ButtonTest { 7 public static void main(String[] args) { 8 EventQueue.invokeLater(() -> { 9 JFrame frame = new Main(); 10 frame.setTitle("身份證"); 11 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 12 frame.setVisible(true); 13 }); 14 } 15 } View Code練習二:
1 package project4; 2 3 import java.awt.*; 4 import java.awt.event.ActionEvent; 5 import java.awt.event.ActionListener; 6 import java.io.BufferedOutputStream; 7 import java.io.File; 8 import java.io.FileOutputStream; 9 import java.io.IOException; 10 import java.util.ArrayList; 11 12 import javax.swing.*; 13 14 public class MyExGUI extends JFrame { 15 ArrayList<String> user_zongti = new ArrayList<String>(); 16 ArrayList<String> user_zonganswer = new ArrayList<String>(); 17 ArrayList<String> user_answer = new ArrayList<String>(); 18 ArrayList<String> true_answer = new ArrayList<String>(); 19 ArrayList<String> jta_timu = new ArrayList<String>(); 20 ArrayList<String> jta_zong = new ArrayList<String>(); 21 ArrayList<Integer> user_fenshu = new ArrayList<Integer>(); 22 JMenuBar jm; // 菜單條組件 23 JMenu menu;// 菜單 24 JMenuItem item1, item2;// 菜單項 25 JMenu build; // 二級菜單 26 JMenuItem file, project; 27 TextArea answer_all = new TextArea(); 28 TextField jta = new TextField(); 29 TextField jta_answer = new TextField(); 30 JLabel num_answer = new JLabel(); 31 JLabel answer; 32 JToolBar jtb;// 工具條 33 JButton jb1, jb2, jb3, jb4, jb5, jb6, jb7, jb_next; 34 int answer_count; 35 int answer_fenshu; 36 37 public MyExGUI() { 38 // 創建菜單 39 jm = new JMenuBar(); 40 41 menu = new JMenu("文件(F)"); 42 menu.setMnemonic('f'); // 助記符 43 44 build = new JMenu("新建"); 45 46 file = new JMenuItem("文件"); 47 project = new JMenuItem("答題"); 48 item1 = new JMenuItem("保存(S)"); 49 item2 = new JMenuItem("退出"); 50 51 answer = new JLabel("第 1 題"); 52 53 // 添加菜單項至菜單上 54 build.add(file); 55 build.add(project); 56 57 menu.add(build); 58 menu.add(item1); 59 menu.add(item2); 60 menu.addSeparator(); 61 // 將菜單加入至菜單欄 62 jm.add(menu); 63 64 JPanel contentPanel = new JPanel(); 65 contentPanel.setLayout(null); 66 JLabel daan = new JLabel("答案"); 67 JLabel dengyu = new JLabel("="); 68 num_answer = answer; 69 num_answer.setFont(new Font("宋體", Font.BOLD, 22)); 70 jb_next = new JButton("下一題"); 71 jta.setFont(new Font("宋體", Font.BOLD, 22)); 72 jta_answer.setFont(new Font("宋體", Font.BOLD, 22)); 73 jb_next.setFont(new Font("宋體", Font.BOLD, 22)); 74 daan.setFont(new Font("宋體", Font.BOLD, 22)); 75 dengyu.setFont(new Font("宋體", Font.BOLD, 22)); 76 77 contentPanel.add(num_answer); 78 contentPanel.add(daan); 79 contentPanel.add(dengyu); 80 contentPanel.add(jta); 81 82 contentPanel.add(jta_answer); 83 contentPanel.add(answer_all); 84 contentPanel.add(jb_next); 85 86 num_answer.setBounds(90, 20, 130, 50); 87 daan.setBounds(250, 20, 90, 50); 88 jta.setBounds(50, 70, 150, 30); 89 dengyu.setBounds(205, 70, 20, 20); 90 jta_answer.setBounds(230, 70, 100, 30); 91 jb_next.setBounds(350, 70, 110, 30); 92 answer_all.setBounds(50, 120, 400, 300); 93 94 this.setJMenuBar(jm); // 添加菜單欄,不能設定位置,會自動放在最上部 95 this.add(contentPanel); 96 97 this.setTitle("在線答題系統"); 98 this.setSize(600, 500); 99 this.setVisible(true); 100 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 101 item1.addActionListener(new ActionListener() { 102 public void actionPerformed(ActionEvent arg0) { 103 FileOutputStream outSTr = null; 104 BufferedOutputStream Buff = null; 105 boolean flag = true; 106 File file; 107 // String test ; 108 do { 109 // test = "test"+count; 110 111 String inputValue = JOptionPane.showInputDialog("Please input file name"); 112 file = new File(inputValue + "test.txt"); 113 if (!file.exists()) { 114 // 創建文件 115 try { 116 117 flag = file.createNewFile(); 118 119 } catch (IOException e) { 120 e.printStackTrace(); 121 122 } 123 flag = false; 124 } else { 125 126 JOptionPane.showMessageDialog(null, "該文件名已存在,請重新輸入", "ERROR", JOptionPane.ERROR_MESSAGE); 127 flag = true; 128 } 129 } while (flag); 130 // 寫入文件 131 String u_answer; 132 try { 133 outSTr = new FileOutputStream(file); 134 Buff = new BufferedOutputStream(outSTr); 135 System.out.println("選擇是后執行的代碼" + user_zongti.size() + user_answer.size()); 136 for (int i = 0; i < user_zongti.size(); i++) { 137 try { 138 Buff.write(user_zongti.get(i).getBytes()); 139 Buff.write(" ".getBytes()); 140 u_answer = user_answer.get(i); 141 if (u_answer.equals("")) 142 u_answer = "沒有作答"; 143 144 Buff.write(u_answer.getBytes()); 145 Buff.write("\r\n".getBytes()); 146 } catch (IOException e) { 147 e.printStackTrace(); 148 i--; 149 } 150 } 151 Buff.flush(); 152 Buff.close(); 153 154 } catch (IOException e) { 155 e.printStackTrace(); 156 } 157 try { 158 outSTr.close(); 159 } catch (IOException e) { 160 e.printStackTrace(); 161 } 162 user_zongti.clear(); 163 user_answer.clear(); 164 } 165 }); 166 167 project.addActionListener(new ActionListener() { 168 public void actionPerformed(ActionEvent arg0) { 169 arithmetic art = new arithmetic(); 170 true_answer = art.list_answer; 171 jta_timu = art.list_timu; 172 jta_zong = art.list; 173 answer_count = 1; 174 answer_all.setText(""); 175 for (int i = 0; i < art.list_timu.size(); i++) { 176 user_zongti.add(jta_zong.get(i)); 177 answer_all.append(jta_timu.get(i)); 178 answer_all.append("\r\n"); 179 } 180 num_answer.setText("第 " + answer_count + " 題"); 181 jta.setText(jta_timu.get(answer_count - 1)); 182 answer_count++; 183 184 } 185 }); 186 jb_next.addActionListener(new ActionListener() { 187 public void actionPerformed(ActionEvent arg0) { 188 String temp; 189 temp = jta_answer.getText(); 190 191 if (jta.getText().equals("")) { 192 JOptionPane.showMessageDialog(null, "錯誤,請導入題庫", "錯誤", JOptionPane.ERROR_MESSAGE); 193 return; 194 } 195 jta_answer.setText(""); 196 if (answer_count <= 10) { 197 if (isInteger(temp)) { 198 199 user_answer.add(temp); 200 System.out.println("選擇否后執行的代碼" + temp + "user_size" + user_answer.size()); 201 num_answer.setText("第 " + answer_count + " 題"); 202 jta.setText(jta_timu.get(answer_count - 1)); 203 answer_count++; 204 } else { 205 JOptionPane.showMessageDialog(null, "錯誤", "請輸入數字", JOptionPane.ERROR_MESSAGE); 206 } 207 } else { 208 user_answer.add(temp); 209 System.out.println("選擇否后執行的代碼" + temp + "user_size" + user_answer.size()); 210 answer_fenshu = 0; 211 for (int i = 0; i < user_answer.size(); i++) { 212 if (user_answer.get(i).equals(true_answer.get(i))) 213 answer_fenshu += 5; 214 } 215 user_fenshu.add(answer_fenshu); 216 Object[] options = { "是", "取消" }; 217 int res = JOptionPane.showOptionDialog(null, "是否查看成績", "答題完畢", JOptionPane.DEFAULT_OPTION, 218 JOptionPane.YES_NO_OPTION, null, options, options[0]); 219 if (res == JOptionPane.YES_OPTION) { 220 chart ct = new chart(user_fenshu); 221 ct.setVisible(true); 222 223 } else { 224 Object[] option = { "是", "取消" }; 225 int res1 = JOptionPane.showOptionDialog(null, "是否退出程序", "終止框", JOptionPane.DEFAULT_OPTION, 226 JOptionPane.YES_NO_OPTION, null, option, option[0]); 227 228 if (res1 == JOptionPane.YES_OPTION) { 229 dispose(); 230 System.exit(0); 231 232 } else { 233 234 } 235 236 } 237 238 } 239 240 } 241 }); 242 243 item2.addActionListener(new ActionListener() { 244 public void actionPerformed(ActionEvent e) { 245 dispose(); 246 System.exit(0); 247 } 248 }); 249 250 } 251 252 public static boolean isInteger(String str) { 253 for (int i = str.length(); --i >= 0;) { 254 if (!Character.isDigit(str.charAt(i))) { 255 return false; 256 } 257 } 258 return true; 259 } 260 261 } View Code 1 package project4; 2 3 public class Main { 4 5 public static void main(String[] args) { 6 MyExGUI lg = new MyExGUI(); 7 //new MyExGUI(); 8 9 } 10 11 } View Code 1 package project4; 2 3 import java.io.BufferedOutputStream; 4 import java.io.File; 5 import java.io.FileOutputStream; 6 import java.io.IOException; 7 import java.util.ArrayList; 8 import java.util.Random; 9 import java.util.Scanner; 10 11 public class arithmetic { 12 ArrayList<String> list = new ArrayList<String>(); 13 ArrayList<String> list_timu = new ArrayList<String>(); 14 ArrayList<String> list_answer = new ArrayList<String>(); 15 16 public arithmetic() { 17 FileOutputStream outSTr = null; 18 BufferedOutputStream Buff = null; 19 int number_n = 10, count; 20 21 ArrayList<String> list_temp = new ArrayList<String>(); 22 String[] operator = new String[] { "+", "-", "*", "/" }; 23 24 Random rand = new Random(); 25 File file1 = new File("test.txt"); 26 if (file1.exists()) { 27 // 創建文件 28 try { 29 file1.createNewFile(); 30 } catch (IOException e) { 31 e.printStackTrace(); 32 } 33 } 34 35 while (number_n > 0) { 36 int[] number_temp = new int[rand.nextInt(2) + 3]; 37 String[] str_temp = new String[number_temp.length - 1]; 38 for (int i = 0; i < number_temp.length; i++) { 39 if (i < number_temp.length - 1) { 40 number_temp[i] = rand.nextInt(100); 41 list_temp.add(String.valueOf(number_temp[i])); 42 str_temp[i] = operator[rand.nextInt(4)]; 43 list_temp.add(str_temp[i]); 44 45 } 46 47 else { 48 number_temp[i] = rand.nextInt(100); 49 list_temp.add(String.valueOf(number_temp[i])); 50 } 51 } 52 53 count = calculate_RPN(produce_RPN(list_temp)); 54 if (count != -1) { 55 list_timu.add(transform_string(list_temp)); 56 list_answer.add(String.valueOf(count)); 57 list_temp.add(" = " + count); 58 list.add(transform_string(list_temp)); 59 number_n--; 60 list_temp.clear(); 61 } else 62 list_temp.clear(); 63 System.out.println(number_n); 64 65 } 66 try { 67 outSTr = new FileOutputStream(file1); 68 Buff = new BufferedOutputStream(outSTr); 69 for (int i = 0; i < list.size(); i++) { 70 try { 71 Buff.write(list.get(i).getBytes()); 72 Buff.write("\r\n".getBytes()); 73 } catch (IOException e) { 74 e.printStackTrace(); 75 i--; 76 } 77 } 78 Buff.flush(); 79 Buff.close(); 80 81 } catch (IOException e) { 82 e.printStackTrace(); 83 } 84 // Buff.close(); 85 try { 86 outSTr.close(); 87 } catch (IOException e) { 88 e.printStackTrace(); 89 } 90 91 for (int i = 0; i < list.size(); i++) { 92 System.out.print(list.get(i)); 93 System.out.println(); 94 } 95 System.out.print("計算完畢!"); 96 97 } 98 99 public static int calculate_RPN(ArrayList<String> list_temp) { 100 int i = 0, t; 101 double a = 0, b = 0; 102 String l_temp; 103 Stack sk = new Stack(10); 104 for (t = 0; t < list_temp.size(); t++) { 105 l_temp = list_temp.get(i++); 106 if (!isInteger(l_temp)) { 107 b = sk.mypop(); 108 a = sk.mypop(); 109 switch (l_temp) { 110 case "+": 111 sk.mypush(a + b); 112 break; 113 case "-": 114 if(!(a<b)) { 115 sk.mypush(a - b); 116 } 117 else 118 return -1; 119 break; 120 case "*": 121 sk.mypush(a * b); 122 break; 123 case "/": 124 if (b == 0||a<b) 125 return -1; 126 sk.mypush(a / b); 127 break; 128 } 129 System.out.println("st.mytop: " + sk.mypeek()); 130 } else { 131 sk.mypush((double) Integer.parseInt(l_temp)); 132 } 133 134 } 135 if (!sk.myisempty()) { 136 a = sk.mypop(); 137 b = a - (int) a; 138 System.out.println("a: " + a); 139 if (a > 0 && b == 0) { 140 return (int) a; 141 } else 142 return -1; 143 } else 144 return -1; 145 146 } 147 148 public static ArrayList<String> produce_RPN(ArrayList<String> list_temp) { 149 int t = 0, i = 0; 150 String tmp; 151 Tack mytack = new Tack(10); 152 ArrayList<String> lt_temp = new ArrayList<String>(); 153 while (true) { 154 tmp = list_temp.get(i++); 155 if (isInteger(tmp)) { 156 lt_temp.add(tmp); 157 } else { 158 if (mytack.myisempty()) { 159 mytack.mypush(tmp); 160 } 161 162 else { 163 if (isCPriority(tmp, mytack.mypeek())) 164 mytack.mypush(tmp); 165 else { 166 lt_temp.add(mytack.mypop()); 167 mytack.mypush(tmp); 168 } 169 170 } 171 } 172 if (i >= list_temp.size()) { 173 while (!mytack.myisempty()) 174 lt_temp.add(mytack.mypop()); 175 System.out.println(transform_string(list_temp)); 176 list_temp = lt_temp; 177 System.out.println(list_temp); 178 return list_temp; 179 } 180 } 181 182 } 183 184 public static boolean isInteger(String str) { 185 for (int i = str.length(); --i >= 0;) { 186 if (!Character.isDigit(str.charAt(i))) { 187 return false; 188 } 189 } 190 return true; 191 } 192 193 public static boolean isCPriority(String str, String s) { 194 if ((str + s).equals("*+") || (str + s).equals("*-") || (str + s).equals("/+") || (str + s).equals("/-")) 195 return true; 196 else 197 return false; 198 } 199 200 public static String transform_string(ArrayList<String> list_temp) { 201 String s = ""; 202 for (int i = 0; i < list_temp.size(); i++) { 203 s += list_temp.get(i); 204 } 205 return s; 206 207 } 208 209 static class Stack { 210 int mytop; 211 double stk[]; 212 213 public Stack(int num) { 214 mytop = -1; 215 stk = new double[num]; 216 } 217 218 /* 出棧 */ 219 double mypop() { 220 double peek = stk[mytop]; 221 mytop--; 222 return peek; 223 } 224 225 /* 入棧 */ 226 void mypush(double x) { 227 mytop++; 228 stk[mytop] = x; 229 230 } 231 232 /* 判空 */ 233 Boolean myisempty() { 234 if (mytop == -1) 235 return true; 236 else 237 return false; 238 } 239 240 /* 取棧頂元素 */ 241 double mypeek() { 242 double peek = stk[mytop]; 243 return peek; 244 } 245 246 /* 棧大小 */ 247 int mysize() { 248 return mytop + 1; 249 } 250 } 251 252 static class Tack { 253 int mytop; 254 String tk[]; 255 256 public Tack(int num) { 257 mytop = -1; 258 tk = new String[num]; 259 } 260 261 /* 出棧 */ 262 String mypop() { 263 String peek = tk[mytop]; 264 mytop--; 265 return peek; 266 } 267 268 /* 入棧 */ 269 void mypush(String x) { 270 mytop++; 271 tk[mytop] = x; 272 273 } 274 275 /* 判空 */ 276 Boolean myisempty() { 277 if (mytop == -1) 278 return true; 279 else 280 return false; 281 } 282 283 /* 取棧頂元素 */ 284 String mypeek() { 285 String peek = tk[mytop]; 286 return peek; 287 } 288 289 /* 棧大小 */ 290 int mysize() { 291 return mytop + 1; 292 } 293 294 } 295 } View Code實驗總結:
通過這一周的學習,掌握了線程的概念,線程創建的兩種技術,以及多線程運行的原理,理解和掌握了線程的優先級屬性及調度方法,線程同步的概念及實現技術。
在編程中布局方面的問題較為困難,展現出來的界面看起來不是很美觀,對布局的內容還有待進一步的理解。
?
轉載于:https://www.cnblogs.com/wy201771010126/p/10125839.html
總結
以上是生活随笔為你收集整理的201771010126 王燕《面向对象程序设计(Java)》第十六周学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MAC下 IEDA发布tomcat项目的
- 下一篇: 覆盖网络 Flannel 0.7