一:理論部分java
1.程序:是一段靜態的代碼,它是應用程序執行的藍本。編程
2.進程:是程序的一次動態執行,它對應了從代碼加載、執行至執行完畢的一個完整過程。canvas
3.多線程:是進程執行過程當中產生的多條執行線索。線程是比進程執行更小的單位。多線程
4.線程不能獨立存在,必須存在於進程中,同一進程的各線程間共享進程空間的數據。dom
5.Java實現多線程有兩種途徑:ide
‐建立Thread類的子類
‐在程序中定義實現Runnable接口的類工具
6.用Thread類的子類建立線程:佈局
a.首先需從Thread類派生出一個子類,在該子類中重寫run()方法。學習
b.而後用建立該子類的對象測試
c.最後用start()方法啓動線程
7.用Runnable()接口實現線程
a.首先設計一個實現Runnable接口的類;
b.而後在類中根據須要重寫run方法;
c.再建立該類對象,以此對象爲參數創建Thread類的對象;
d.調用Thread類對象的start方法啓動線程,將CPU執行權轉交到run方法
8.線程的終止:
a.首先設計一個實現Runnable接口的類;
b.而後在類中根據須要重寫run方法;
c.再建立該類對象,以此對象爲參數創建Thread類的對象;
d.調用Thread類對象的start方法啓動線程,將CPU執行權轉交到run方法
void interrupt()
e.向一個線程發送一箇中斷請求,同時把這個線程的「interrupted」狀態置爲true。
f.若該線程處於 blocked 狀 態 , 會拋出InterruptedException。
9.測試線程是否被中斷的方法
a.static boolean interrupted()
檢測當前線程是否已被中斷 , 並重置狀態「interrupted」值爲false。
b.boolean isInterrupted()
– 檢測當前線程是否已被中斷 , 不改變狀態「interrupted」值.
10.線程有以下7種狀態:
1)New (新建)
2) Runnable (可運行)
3) Running(運行)
4) Blocked (被阻塞)
5) Waiting (等待)
6) Timed waiting (計時等待)
7) Terminated (被終止)
11.新建線程:new(新建)線程對象剛剛建立,尚未啓動,此時線程還處於不可運行狀態。
例如:Thread thread=new Thread(r);
此時線程thread處於新建狀態,有了相應的內存空間以及其它資源。
12.Thread類有三個與線程優先級有關的靜態量:
a.MAX_PRIORITY:最大優先權,值爲10;
b. MIN_PRIORITY:最小優先權,值爲1;
c. NORM _PRIORITY:默認優先權,值爲5.
二:實驗部分
1、實驗目的與要求
(1) 掌握線程概念;
(2) 掌握線程建立的兩種技術;
(3) 理解和掌握線程的優先級屬性及調度方法;
(4) 掌握線程同步的概念及實現技術;
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(); } }
使用Runable接口改造後的程序以下:
class Lefthand implements Runnable { public void run() { for(int i=0;i<=5;i++) { System.out.println("You are Students!"); try{ Thread.sleep(500);//休眠500毫秒 } catch(InterruptedException e) { System.out.println("Lefthand error.");} } } } class Righthand implements Runnable { public void run() { for(int i=0;i<=5;i++) { System.out.println("I am a Teacher!"); try{ Thread.sleep(300);//休眠300毫秒 } catch(InterruptedException e) { System.out.println("Righthand error.");} } } } public class ThreadTest { public static void main(String[] args) { Righthand righthand = new Righthand();//新建一個righthand對象 Lefthand lefthand = new Lefthand();//新建一個lefthand對象 Thread right = new Thread(righthand);//start方法在Thread類中,新建Thread類 right.start(); Thread left=new Thread(lefthand); left.start(); } }
程序運行結果以下:
測試程序2:
l 在Elipse環境下調試教材625頁程序14-一、14-2 、14-3,結合程序運行結果理解程序;
l 在Elipse環境下調試教材631頁程序14-4,結合程序運行結果理解程序;
l 對比兩個程序,理解線程的概念和用途;
l 掌握線程建立的兩種技術。
程序以下:
14-一、14-2 、14-3:
import java.awt.*; import java.util.*; import javax.swing.*; /** * The component that draws the balls. * @version 1.34 2012-01-26 * @author Cay Horstmann */ public class BallComponent extends JPanel { private static final int DEFAULT_WIDTH = 450; private static final int DEFAULT_HEIGHT = 350; private java.util.List<Ball> balls = new ArrayList<>(); /** * Add a ball to the component. * @param b the ball to add */ public void add(Ball b) { balls.add(b); } public void paintComponent(Graphics g) { super.paintComponent(g); // 擦除背景 Graphics2D g2 = (Graphics2D) g; for (Ball b : balls) { g2.fill(b.getShape()); } } public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); } }
import java.awt.*; import java.awt.event.*; import javax.swing.*; /** * Shows an animated bouncing ball. * @version 1.34 2015-06-21 * @author Cay Horstmann */ public class Bounce { public static void main(String[] args) { EventQueue.invokeLater(() -> { JFrame frame = new BounceFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }); } } /** * The frame with ball component and buttons. */ class BounceFrame extends JFrame { private BallComponent comp; public static final int STEPS = 1000; public static final int DELAY = 3; /** * Constructs the frame with the component for showing the bouncing ball and * Start and Close buttons */ public BounceFrame() { setTitle("Bounce"); comp = new BallComponent(); add(comp, BorderLayout.CENTER);//使用邊框佈局管理器使其顯示在窗口中心位置 JPanel buttonPanel = new JPanel(); addButton(buttonPanel, "Start", event -> addBall());//在窗口添加兩個按鈕 addButton(buttonPanel, "Close", event -> System.exit(0)); add(buttonPanel, BorderLayout.SOUTH);//使用邊框佈局管理器使其顯示在窗口下方位置 pack(); } /** * Adds a button to a container. * @param c the container * @param title the button title * @param listener the action listener for the button */ public void addButton(Container c, String title, ActionListener listener) { JButton button = new JButton(title); c.add(button); button.addActionListener(listener); } /** * Adds a bouncing ball to the panel and makes it bounce 1,000 times. */ public void addBall() { try { Ball ball = new Ball(); comp.add(ball); for (int i = 1; i <= STEPS; i++) { ball.move(comp.getBounds()); comp.paint(comp.getGraphics()); Thread.sleep(DELAY); } } catch (InterruptedException e) { } } }
import java.awt.geom.*; /** * A ball that moves and bounces off the edges of a rectangle * @version 1.33 2007-05-17 * @author Cay Horstmann */ public class Ball { private static final int XSIZE = 15; private static final int YSIZE = 15; private double x = 0; private double y = 0; private double dx = 1; private double dy = 1; /** * 將球移動到下一個位置,若是球碰到其中一條邊,則反向移動 */ public void move(Rectangle2D bounds) { x += dx; y += dy; if (x < bounds.getMinX()) { x = bounds.getMinX(); dx = -dx; } if (x + XSIZE >= bounds.getMaxX()) { x = bounds.getMaxX() - XSIZE; dx = -dx; } if (y < bounds.getMinY()) { y = bounds.getMinY(); dy = -dy; } if (y + YSIZE >= bounds.getMaxY()) { y = bounds.getMaxY() - YSIZE; dy = -dy; } } /** *獲取球在當前位置的形狀。 */ public Ellipse2D getShape() { return new Ellipse2D.Double(x, y, XSIZE, YSIZE); } }
運行結果以下:
14-4:
package bounceThread; import java.awt.*; import java.awt.event.*; import javax.swing.*; /** * Shows animated bouncing balls. * @version 1.34 2015-06-21 * @author Cay Horstmann */ public class BounceThread { public static void main(String[] args) { EventQueue.invokeLater(() -> { JFrame frame = new BounceFrame(); frame.setTitle("BounceThread"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }); } } /** * The frame with panel and buttons. */ class BounceFrame extends JFrame { private BallComponent comp; public static final int STEPS = 1000; public static final int DELAY = 5; /** * Constructs the frame with the component for showing the bouncing ball and * Start and Close buttons */ public BounceFrame() { comp = new BallComponent(); add(comp, BorderLayout.CENTER);//使用邊框佈局管理器將它放在窗口的中心位置 JPanel buttonPanel = new JPanel(); addButton(buttonPanel, "Start", event -> addBall()); addButton(buttonPanel, "Close", event -> System.exit(0)); add(buttonPanel, BorderLayout.SOUTH);//使用邊框佈局管理器將它放在窗口的中心位置 pack(); } /** * Adds a button to a container. * @param c the container * @param title the button title * @param listener the action listener for the button */ public void addButton(Container c, String title, ActionListener listener) { JButton button = new JButton(title); c.add(button); button.addActionListener(listener); } /** * Adds a bouncing ball to the canvas and starts a thread to make it bounce */ public void addBall() { Ball ball = new Ball(); comp.add(ball); Runnable r = () -> { try { for (int i = 1; i <= STEPS; i++) { ball.move(comp.getBounds()); comp.repaint(); Thread.sleep(DELAY); } } catch (InterruptedException e) { } }; Thread t = new Thread(r); t.start();//調用Thread類中的start方法 } }
package bounceThread; import java.awt.*; import java.util.*; import javax.swing.*; /** * The component that draws the balls. * @version 1.34 2012-01-26 * @author Cay Horstmann */ public class BallComponent extends JComponent { private static final int DEFAULT_WIDTH = 450; private static final int DEFAULT_HEIGHT = 350; private java.util.List<Ball> balls = new ArrayList<>(); /** * Add a ball to the panel. * @param b the ball to add */ public void add(Ball b) { balls.add(b); } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; for (Ball b : balls) { g2.fill(b.getShape()); } } public Dimension getPreferredSize() { return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT); } }
package bounceThread; import java.awt.geom.*; /** A ball that moves and bounces off the edges of a rectangle * @version 1.33 2007-05-17 * @author Cay Horstmann */ public class Ball { private static final int XSIZE = 15; private static final int YSIZE = 15; private double x = 0; private double y = 0; private double dx = 1; private double dy = 1; /** Moves the ball to the next position, reversing direction if it hits one of the edges */ public void move(Rectangle2D bounds) { x += dx; y += dy; if (x < bounds.getMinX()) { x = bounds.getMinX(); dx = -dx; } if (x + XSIZE >= bounds.getMaxX()) { x = bounds.getMaxX() - XSIZE; dx = -dx; } if (y < bounds.getMinY()) { y = bounds.getMinY(); dy = -dy; } if (y + YSIZE >= bounds.getMaxY()) { y = bounds.getMaxY() - YSIZE; dy = -dy; } } /** Gets the shape of the ball at its current position. */ public Ellipse2D getShape() { return new Ellipse2D.Double(x, y, XSIZE, YSIZE); } }
程序運行結果以下:
測試程序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);//設置1爲最小優先級 runner[3].setPriority(MAX_PRIORITY);//設置3位最大優先級 } public void run( ) { for(int i=0; i<1000000; i++);//運行時產生的延時,這段時間在執行for循環(爲空時也執行),直到執行結束後開始執行後面的語句(也可用sleep拋出異常) System.out.println(getName()+"線程的優先級是"+getPriority()+"已計算完畢!"); } }
程序運行結果以下:
測試程序4
l 教材642頁程序模擬一個有若干帳戶的銀行,隨機地生成在這些帳戶之間轉移錢款的交易。每個帳戶有一個線程。在每一筆交易中,會從線程所服務的帳戶中隨機轉移必定數目的錢款到另外一個隨機帳戶。
l 在Elipse環境下調試教材642頁程序14-五、14-6,結合程序運行結果理解程序;
package unsynch; /** * This program shows data corruption when multiple threads access a data structure. * @version 1.31 2015-06-21 * @author Cay Horstmann */ public class UnsynchBankTest { public static final int NACCOUNTS = 100; public static final double INITIAL_BALANCE = 1000;//期初餘額 public static final double MAX_AMOUNT = 1000;//最大數量 public static final int DELAY = 10;//延時 public static void main(String[] args) { Bank bank = new Bank(NACCOUNTS, INITIAL_BALANCE); for (int i = 0; i < NACCOUNTS; i++) { int fromAccount = i; Runnable r = () -> { try { while (true) { int toAccount = (int) (bank.size() * Math.random());//生成隨機數 double amount = MAX_AMOUNT * Math.random(); bank.transfer(fromAccount, toAccount, amount); Thread.sleep((int) (DELAY * Math.random())); } } catch (InterruptedException e) { } }; Thread t = new Thread(r); t.start(); } } }
package unsynch; import java.util.*; /** * A bank with a number of bank accounts. * @version 1.30 2004-08-01 * @author Cay Horstmann */ public class Bank { private final double[] accounts; /** * Constructs the bank. * @param n the number of accounts * @param initialBalance the initial balance for each account */ public Bank(int n, double initialBalance) { accounts = new double[n]; Arrays.fill(accounts, initialBalance); } /** * Transfers money from one account to another. * @param from the account to transfer from * @param to the account to transfer to * @param amount the amount to transfer */ public void transfer(int from, int to, double amount) { if (accounts[from] < amount) return; System.out.print(Thread.currentThread()); accounts[from] -= amount; System.out.printf(" %10.2f from %d to %d", amount, from, to); accounts[to] += amount; System.out.printf(" Total Balance: %10.2f%n", getTotalBalance()); } /** * Gets the sum of all account balances. * @return the total balance */ public double getTotalBalance() { double sum = 0; for (double a : accounts) sum += a; return sum; } /** * Gets the number of accounts in the bank. * @return the number of accounts */ public int size() { return accounts.length; } }
運行結果:
綜合編程練習
編程練習1
(1) 用戶信息輸入界面以下圖所示:
(2) 用戶點擊提交按鈕時,用戶輸入信息顯示控制檯界面;
(3) 用戶點擊重置按鈕後,清空用戶已輸入信息;
(4) 點擊窗口關閉,程序退出。
程序以下:
import java.awt.EventQueue; import javax.swing.JFrame; public class Mian { public static void main(String[] args) { EventQueue.invokeLater(() -> { DemoJFrame page = new DemoJFrame(); }); } }
import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.GridLayout; import java.awt.LayoutManager; import java.awt.Panel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.Timer; import java.util.TimerTask; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.ButtonModel; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; public class DemoJFrame extends JFrame { private JPanel jPanel1; private JPanel jPanel2; private JPanel jPanel3; private JPanel jPanel4; private JTextField fieldname; private JComboBox comboBox; private JTextField fieldadress; private ButtonGroup bg; private JRadioButton nan; private JRadioButton nv; private JCheckBox sing; private JCheckBox dance; private JCheckBox draw; public DemoJFrame() { // 設置窗口大小 this.setSize(800, 400); // 設置可見性 this.setVisible(true); // 設置標題 this.setTitle("Student Detail"); // 設置關閉操做 this.setDefaultCloseOperation(EXIT_ON_CLOSE); // 設置窗口居中 WinCenter.center(this); // 建立四個面板對象 jPanel1 = new JPanel(); setJPanel1(jPanel1); jPanel2 = new JPanel(); setJPanel2(jPanel2); jPanel3 = new JPanel(); setJPanel3(jPanel3); jPanel4 = new JPanel(); setJPanel4(jPanel4); // 設置容器爲流式佈局 FlowLayout flowLayout = new FlowLayout(); this.setLayout(flowLayout); // 將四個面板添加到容器中 this.add(jPanel1); this.add(jPanel2); this.add(jPanel3); this.add(jPanel4); } /* * 設置面板一 */ private void setJPanel1(JPanel jPanel) { jPanel.setPreferredSize(new Dimension(700, 45));//設置此組件的首選大小 // 給面板的佈局設置爲網格佈局 一行4列 jPanel.setLayout(new GridLayout(1, 4)); JLabel name = new JLabel("Name:"); name.setSize(100, 50); fieldname = new JTextField(""); fieldname.setSize(80, 20); JLabel study = new JLabel("Qualification:"); comboBox = new JComboBox(); comboBox.addItem("Graduate"); comboBox.addItem("senior"); comboBox.addItem("Undergraduate"); jPanel.add(name); jPanel.add(fieldname); jPanel.add(study); jPanel.add(comboBox); } /* * 設置面板二 */ private void setJPanel2(JPanel jPanel) { jPanel.setPreferredSize(new Dimension(700, 50)); // 給面板的佈局設置爲網格佈局 一行4列 jPanel.setLayout(new GridLayout(1, 4)); JLabel name = new JLabel("Address:"); fieldadress = new JTextField(); fieldadress.setPreferredSize(new Dimension(150, 50)); JLabel study = new JLabel("Hobby:"); JPanel selectBox = new JPanel(); selectBox.setBorder(BorderFactory.createTitledBorder("")); selectBox.setLayout(new GridLayout(3, 1)); sing = new JCheckBox("Singing"); dance = new JCheckBox("Dancing"); draw = new JCheckBox("Reading"); selectBox.add(sing); selectBox.add(dance); selectBox.add(draw); jPanel.add(name); jPanel.add(fieldadress); jPanel.add(study); jPanel.add(selectBox); } /* * 設置面板三 */ private void setJPanel3(JPanel jPanel) { jPanel.setPreferredSize(new Dimension(700, 150)); FlowLayout flowLayout = new FlowLayout(FlowLayout.LEFT); jPanel.setLayout(flowLayout); JLabel sex = new JLabel("Sex:"); JPanel selectBox = new JPanel(); selectBox.setBorder(BorderFactory.createTitledBorder("")); selectBox.setLayout(new GridLayout(2, 1)); bg = new ButtonGroup(); nan = new JRadioButton("Male"); nv = new JRadioButton("Female"); bg.add(nan); bg.add(nv); selectBox.add(nan); selectBox.add(nv); jPanel.add(sex); jPanel.add(selectBox); } /* * 設置面板四 */ private void setJPanel4(JPanel jPanel) { // TODO 自動生成的方法存根 jPanel.setPreferredSize(new Dimension(700, 150)); FlowLayout flowLayout = new FlowLayout(FlowLayout.CENTER, 50, 10); jPanel.setLayout(flowLayout); jPanel.setLayout(flowLayout); JButton sublite = new JButton("Validate"); JButton reset = new JButton("Reset"); sublite.addActionListener((e) -> valiData()); reset.addActionListener((e) -> Reset()); jPanel.add(sublite); jPanel.add(reset); } /* * 提交數據 */ private void valiData() { // 拿到數據 String name = fieldname.getText().toString().trim(); String xueli = comboBox.getSelectedItem().toString().trim(); String address = fieldadress.getText().toString().trim(); System.out.println(name); System.out.println(xueli); String hobbystring=""; if (sing.isSelected()) { hobbystring+="Singing "; } if (dance.isSelected()) { hobbystring+="Dancing "; } if (draw.isSelected()) { hobbystring+="Reading "; } System.out.println(address); if (nan.isSelected()) { System.out.println("Male"); } if (nv.isSelected()) { System.out.println("Female"); } System.out.println(hobbystring); } /* * 重置 */ private void Reset() { fieldadress.setText(null); fieldname.setText(null); comboBox.setSelectedIndex(0); sing.setSelected(false); dance.setSelected(false); draw.setSelected(false); bg.clearSelection(); } }
import java.awt.Dimension; import java.awt.Toolkit; import java.awt.Window; public class WinCenter { public static void center(Window win){ Toolkit tkit = Toolkit.getDefaultToolkit();//獲取默認工具包 Dimension sSize = tkit.getScreenSize();//獲取屏幕的大小 Dimension wSize = win.getSize(); if(wSize.height > sSize.height){ wSize.height = sSize.height; } if(wSize.width > sSize.width){ wSize.width = sSize.width; } win.setLocation((sSize.width - wSize.width)/ 2, (sSize.height - wSize.height)/ 2);//將組件移到新的位置 } }
運行結果:
2.建立兩個線程,每一個線程按順序輸出5次「你好」,每一個「你好」要標明來自哪一個線程及其順序號。
package test2; class Lefthand extends Thread { public void run() { for(int i=0;i<=4;i++) { System.out.println("1.你好"); try{ sleep(500); } catch(InterruptedException e) { System.out.println("Lefthand error.");} } } } class Righthand extends Thread { public void run() { for(int i=0;i<=4;i++) { System.out.println("2.你好"); try{ sleep(300); } catch(InterruptedException e) { System.out.println("Righthand error.");} } } } public class AAAA { static Lefthand left; static Righthand right; public static void main(String[] args) { left=new Lefthand(); right=new Righthand(); left.start(); right.start(); } }
運行結果:
3. 完善實驗十五 GUI綜合編程練習程序。
實驗一:
import java.awt.*; import javax.swing.*; public class CardTest { public static void main(String[] args) { EventQueue.invokeLater(() -> { JFrame frame = new Main(); frame.setTitle("身份證"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }); } }
public class Card implements Comparable<Card> { private String name; private String id; private String sex; private int age; private String area; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getId() { return id; } public void setId(String id) { this.id = id; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getArea() { return area; } public void setArea(String area) { this.area = area; } public int compareTo(Card c) { return this.name.compareTo(c.getName()); } public String toString() { return name + "\t" + id + "\t" + sex + "\t" + age + "\t" + area + "\n"; } }
import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import javax.swing.*; public class Main extends JFrame { private static ArrayList<Card> cardlist; private static ArrayList<Card> list; private JPanel panel; private JPanel Panel1; private static final int DEFAULT_WITH = 600; private static final int DEFAULT_HEIGHT = 300; public Main() { cardlist = new ArrayList<>(); Scanner scanner = new Scanner(System.in); File file = new File("E:\\身份證號.txt"); try { FileInputStream fis = new FileInputStream(file); BufferedReader in = new BufferedReader(new InputStreamReader(fis)); String temp = null; while ((temp = in.readLine()) != null) { Scanner linescanner = new Scanner(temp); linescanner.useDelimiter(" "); String name = linescanner.next(); String id = linescanner.next(); String sex = linescanner.next(); String age = linescanner.next(); String area = linescanner.nextLine(); Card card = new Card(); card.setName(name); card.setId(id); card.setSex(sex); int a = Integer.parseInt(age); card.setAge(a); card.setArea(area); cardlist.add(card); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block System.out.println("信息文件找不到"); e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block System.out.println("信息文件讀取錯誤"); e.printStackTrace(); } panel = new JPanel(); panel.setLayout(new BorderLayout()); JTextArea jt = new JTextArea(); panel.add(jt); add(panel, BorderLayout.NORTH); Panel1 = new JPanel(); Panel1.setLayout(new GridLayout(1, 9)); JButton jButton = new JButton("字典排序"); JButton jButton1 = new JButton("年齡最大和年齡最小"); JLabel lab = new JLabel("尋找老鄉:", Label.LEFT); JTextField jt1 = new JTextField(); JLabel lab1 = new JLabel("尋找年齡相近的人:", Label.LEFT); JTextField jt2 = new JTextField(); JLabel lab2 = new JLabel("輸入你的身份證號碼:", Label.LEFT); JTextField jt3 = new JTextField(); JButton jButton2 = new JButton("退出"); jButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO 自動生成的方法存根 Collections.sort(cardlist); jt.setText(cardlist.toString()); } }); jButton1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO 自動生成的方法存根 int max = 0, min = 100; int j, k1 = 0, k2 = 0; for (int i = 1; i < cardlist.size(); i++) { j = cardlist.get(i).getAge(); if (j > max) { max = j; k1 = i; } if (j < min) { min = j; k2 = i; } } jt.setText("年齡最大:" + cardlist.get(k1) + "年齡最小:" + cardlist.get(k2)); } }); jButton2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { dispose(); System.exit(0); } }); jt1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String find = jt1.getText(); String text = ""; String place = find.substring(0, 3); for (int i = 0; i < cardlist.size(); i++) { if (cardlist.get(i).getArea().substring(1, 4).equals(place)) { text += "\n" + cardlist.get(i); jt.setText("老鄉:" + text); } } } }); jt2.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String yourage = jt2.getText(); int a = Integer.parseInt(yourage); int near = agenear(a); jt.setText("年齡相近:" + cardlist.get(near)); } }); jt3.addKeyListener(new KeyAdapter() { public void keyTyped(KeyEvent e) { // TODO 自動生成的方法存根 list = new ArrayList<>(); Collections.sort(cardlist); String key = jt3.getText(); for (int i = 1; i < cardlist.size(); i++) { if (cardlist.get(i).getId().contains(key)) { list.add(cardlist.get(i)); jt.setText("你多是:\n" + list); } } } }); Panel1.add(jButton); Panel1.add(jButton1); Panel1.add(lab); Panel1.add(jt1); Panel1.add(lab1); Panel1.add(jt2); Panel1.add(lab2); Panel1.add(jt3); Panel1.add(jButton2); add(Panel1, BorderLayout.SOUTH); setSize(DEFAULT_WITH, DEFAULT_HEIGHT); } public static int agenear(int age) { int j = 0, min = 100, value = 0, k = 0; for (int i = 0; i < cardlist.size(); i++) { value = cardlist.get(i).getAge() - age; if (value < 0) value = -value; if (value < min) { min = value; k = i; } } return k; } }
實驗二:
import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import javax.swing.*; public class Demo extends JFrame { int i = 0, i1 = 0, k = 0, sum = 0; private PrintWriter out = null; private String[] c1 = new String[10]; private String[] c2 = new String[10]; public Demo() { JPanel panel = new JPanel(); panel.setLayout(new GridLayout(1, 3)); JTextArea jt1 = new JTextArea(); JTextField jt2 = new JTextField(); JTextArea jt3 = new JTextArea(); panel.add(jt1); panel.add(jt2); panel.add(jt3); add(panel, BorderLayout.NORTH); JPanel panel1 = new JPanel(); panel1.setLayout(new GridLayout(1, 2)); Button button1 = new Button("生成題目"); Button button2 = new Button("生成文件"); panel1.add(button1); panel1.add(button2); add(panel1, BorderLayout.SOUTH); setSize(600, 300); button1.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO 自動生成的方法存根 jt2.setText(null); jt3.setText(null); if (i < 10) { int a = (int) (Math.random() * 100); int b = (int) (Math.random() * 100); int m = (int) Math.round(Math.random() * 3); switch (m) { case 0: while (b == 0 || a % b != 0) { b = (int) Math.round(Math.random() * 100); a = (int) Math.round(Math.random() * 100); } jt1.setText(i + 1 + ": " + a + "/" + b + "="); c1[i] = jt1.getText(); k = a / b; i++; break; case 1: jt1.setText(i + 1 + ": " + a + "*" + b + "="); c1[i] = jt1.getText(); k = a * b; i++; break; case 2: jt1.setText(i + 1 + ": " + a + "+" + b + "="); c1[i] = jt1.getText(); k = a + b; i++; break; case 3: while (a < b) { int x = a; a = b; b = x; } jt1.setText(i + 1 + ": " + a + "-" + b + "="); c1[i] = jt1.getText(); k = a - b; i++; break; } } } }); jt2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO 自動生成的方法存根 if (i < 11) { int find = Integer.parseInt(jt2.getText()); String d = jt2.getText().toString().trim(); if (jt2.getText() != "") { if (find == k) { sum += 10; jt3.setText("答案正確"); } else jt3.setText("答案錯誤"); } c2[i1] = d; i1++; } } }); button2.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // TODO 自動生成的方法存根 try { out = new PrintWriter("text.txt"); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } for (int counter = 0; counter < 10; counter++) { out.println(c1[counter] + c2[counter]); } out.println("成績爲" + sum); out.close(); } }); } }
import java.awt.*; import javax.swing.*; public class DemoTest { public static void main(String[] args) { EventQueue.invokeLater(() -> { JFrame frame = new Demo(); frame.setTitle("計算題"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }); } }
三:實驗總結
這周主要學習了線程,線程是程序中一個單一的順序從控制流程。在學習過程當中,瞭解了線程建立的兩種技術:用Thread類的子類建立線程以及用Runnable()接口實現線程。可是在實際操做過程當中,發現本身還存在着很大的問題。在實驗課上老師和學長的幫助西啊,理解了線程中的優先級。課後本身還會再繼續學習。