201621123061《Java課程設計》第11次學習總結

1. 本週學習總結

1.1 以你喜歡的方式(思惟導圖或其餘)概括總結多線程相關內容。

  • 1.建立線程有兩個方法,但咱們通常只用中一個,即定義實現Runnable接口的類,實現它的run()方法,,而後將這個類的實例做爲Thread構造方法的參數。
  • 2.Runnable是任務,只有Thread是線程。必須將實現Runnable的類的對象放入Thread中,才能在線程中運行。
  • 3.多線程的衝突能夠用使用synchronized標記方法和標記代碼塊。
  • 4.volatile用來修飾變量,就會讓變量之間具備可見性。javascript

    2. 書面做業

本次PTA做業題集多線程java

1. 源代碼閱讀:多線程程序BounceThread

1.1 BallRunnable類有什麼用?爲何代碼中須要調用Thread.sleep進行休眠?

BallRunnable類實現了Runnable接口,重寫了Run方法,支持多線程指派任務,使用Thread.sleep進行休眠是爲了讓咱們看清楚小球移動的軌跡,不然速度太快看不清楚。sql

1.2 Ball.java只作了兩件事,這兩件事分別是什麼?BallComponent對象是幹什麼的?其內部的ArrayList有什麼用?程序運行過程當中,生成了幾個BallComponent對象?該程序使用了多線程技術,每一個小球是分別在不一樣的線程中進行繪製嗎?

  • 定義了兩個方法:分別是move()實現小球移動。getShape()獲取座標和大小。
  • 定義兩個方法:分別是add()添加球球,和paintComponent()打印球球。ArrayList用來存放小球。
  • 運行過程,生成一個BallComponent對象。
  • 是。安全

    1.3 選作:程序改寫:程序運行時,每一個小球都是從固定位置出發。如何改寫該程序,使得當點擊start時,每一個小球能夠從不一樣位置出發、以不一樣的步進移動?

    每一個小球能夠從不一樣位置出發,也就是隨機出發,那就使用Math.random().多線程

private double x = Math.random()*50;
   private double y = Math.random()*50;
   private double dx = Math.random()*5;
   private double dy = Math.random()*5;

1.4 選作:不一樣小球的移動軌跡如出一轍。改造程序,使得每一個小球運行軌跡不徹底同樣,好比有的能夠走餘弦軌跡、有的能夠走方波軌跡、有的走布朗運動、有的走五角星,等等。

2. 實驗總結:題集(多線程)

2.1 題目:Thread、PrintTask、Runnable與匿名內部類。

並回答:a)經過定義Runnable接口的實現類來實現多線程程序比經過繼承自Thread類實現多線程程序有何好處?b) 6-1,6-3,6-11實驗總結。dom

  • a).Java不能多繼承,可是能夠實現多個接口。
  • b).6-1 MyThread繼承Thread,要重寫run()。6-3.用Thread.currentThread().getName()能夠獲取當前的線程名字。6-11.這一題和6-1 Thread差很少,只不過一個是繼承類,一個是實現接口。佈局

    2.2 使用Lambda表達式改寫6-3

Thread t1 = new Thread(() -> {
            System.out.println(mainThreadName);
            System.out.println(Thread.currentThread().getName());
            System.out.println(Arrays.toString(Thread.class.getInterfaces()));
        });

2.3 題目:6-2(Runnable與中止線程)。回答:須要怎樣才能正確地中止一個運行中的線程?

要對word判空,剛開始作的·時候沒有判空會拋出空指針的異常。
在while循環時加個flag控制跳出循環,不要用stop不安全。性能

2.4 選作:6-8(CountDownLatch)實驗總結

使用Executors類的newFixedThreadPool()方法建立一個線程池。學習

2.5 選作:6-9(集合同步問題)實驗總結

用synchronizedList修飾list。this

2.6 選作:較難:6-10(Callable),並回答爲何有Runnable了還須要Callable?實驗總結。

3. 互斥訪問

3.1 修改TestUnSynchronizedThread.java源代碼使其能夠同步訪問。(關鍵代碼截圖,需出現學號)


3.2 選作:進一步使用執行器改進相應代碼(關鍵代碼截圖,需出現學號)

4. 互斥訪問與同步訪問

完成題集6-4(互斥訪問)與6-5(同步訪問)

4.1 除了使用synchronized修飾方法實現互斥同步訪問,還有什麼辦法可使用synchronized實現互斥同步訪問,使用代碼說明(請出現相關代碼及學號)?

使用lock,unlock。

\\陳錦霞201621123061
public void deposit(int money) {
    lock.lock();
    try {
        this.balance += money;
        condition.signal();
    } finally {
        lock.unlock();
    }
}

public void withdraw(int money) {
    lock.lock();
    try {
        while (this.balance - money < 0) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }
        this.balance -= money;
        condition.signal();
    } finally {
        lock.unlock();
    }
}

4.2 同步代碼塊與同步方法有何區別?

使用synchronized關鍵字修飾的方法叫同步方法,此時內置鎖會保護整個方法。鎖的範圍比較大。
使用synchronized關鍵字修飾的語句塊叫同步代碼塊。被該關鍵字修飾的語句塊會自動被加上內置鎖,鎖的範圍比較小,性能較好。

4.3 實現互斥訪問的原理是什麼?請使用對象鎖概念並結合相應的代碼塊進行說明。當程序執行synchronized同步代碼塊或者同步方法時,線程的狀態是怎麼變化的?

  • 經過得到惟一的鎖來打開資源,其餘線程就先等待,notify()以後進入Lock Pool,使用資源以後,就把鎖還回去。

    th1得到id鎖,讀取值,th2等待,th1的id+1,將值傳給id,鎖被釋放。th2得到鎖,重複th1的步驟。
    線程變化:多個線程進行爭奪對象鎖,一個線程得到對象鎖,其他等待該線程結束。

    4.4 Java多線程中使用什麼關鍵字實現線程之間的通訊,進而實現線程的協同工做?

    wait()和notify()。

5. 線程間的合做:生產者消費者問題

5.1 運行MyProducerConsumerTest.java。正常運行結果應該是倉庫還剩0個貨物。多運行幾回,觀察結果,並回答:結果正常嗎?哪裏不正常?爲何?

  • 不正常。每次結果都是不肯定的。Comsumor和Producer的速度不同,同時進行存取操做。衝突了。

    5.2 使用synchronized, wait, notify解決該問題(關鍵代碼截圖,需出現學號)

//陳錦霞201621123061
class Repository {// 存放字符串的倉庫
    private int capacity = 10;//倉庫容量默認爲10
    private List<String> repo = new ArrayList<String>();// repo(倉庫),最多隻能放10個

    public synchronized void add(String t) {
        while(repo.size() >= capacity) {
            System.out.println("倉庫已滿!沒法添加貨物。");
         
        try{
            wait();
        }catch(Exception e){
            e.printStackTrace();
        }
        
    }
        repo.add(t);    
        System.out.println("已添加!");
        notify();
    }
    public synchronized void remove() {
        while(repo.size() <= 0) {
            System.out.println("倉庫無貨!沒法從倉庫取貨");
            
          try{
            wait();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
        repo.remove(0); 
        System.out.println("已取走!");
        notify();
}

5.3 選作:使用Lock與Condition對象解決該問題。

//陳錦霞201621123061
class Repository {// 存放字符串的倉庫
    private int capacity = 10;//倉庫容量默認爲10
    private List<String> repo = new ArrayList<String>();// repo(倉庫),最多隻能放10個

    public synchronized void add(String t) {
        lock.lock();
        while(repo.size() >= capacity) {
            System.out.println("倉庫已滿!沒法添加貨物。");      
        try{
            condition.await();
        }catch(Exception e){
            e.printStackTrace();
        }
        
    }
        repo.add(t);    
        System.out.println("已添加!");
        condition.signal();
        lock.unlock();
    }
    public synchronized void remove() {
        lock.lock();
        while(repo.size() <= 0) {
            System.out.println("倉庫無貨!沒法從倉庫取貨");
            
          try{
              condition.await();
        }catch(Exception e){
            e.printStackTrace();
        }
    }
        repo.remove(0); 
        System.out.println("已取走!");
        condition.signal();
        lock.unlock();
}

6. 面向對象設計做業-圖書館管理系統

6.1 系統的功能模塊表格,表格中體現出每一個模塊的負責人。

我本身

6.2 運行視頻

沒有作出來,主要是時間過短,本身基礎也並很差,模仿資料寫的。

6.3 講解本身負責的模塊,並粘貼本身負責模塊的關鍵代碼(出現學號及姓名)。

只有一小部分代碼

import java.awt.*;
 import java.awt.event.*;
 import java.sql.*;
 import javax.swing.*;
 
 public class Login extends JFrame{
    //聲明標籤、按鈕、文本框和密碼框
    private JLabel JLb1;
    private JLabel JLb2; 
    private JButton Ok_btn;
    private JButton Cancel_btn;
    private JTextField jtflduser;
    private JPasswordField jtpwdfld;
    //聲明窗口
    private JFrame frame;
    //構造方法
    public Login(){
        frame=new JFrame("登陸");
        Container content=frame.getContentPane();
        //採用GridLayout佈局管理器
        content.setLayout(new GridLayout(3,2,20,20));       
        JLb1=new JLabel("用戶名");
        JLb2=new JLabel("密   碼");
        //將標籤置於居中位置
        JLb1.setHorizontalAlignment(SwingConstants.CENTER);     
        JLb2.setHorizontalAlignment(SwingConstants.CENTER);
        jtflduser=new JTextField();
        jtpwdfld=new JPasswordField();
        Ok_btn=new JButton("肯定");
        Cancel_btn=new JButton("取消");
        //爲按鈕增長事件監聽者
        Ok_btn.addActionListener(new ActionHandler());
        Cancel_btn.addActionListener(new ActionHandler());
        //添加標籤、文本框和密碼框到窗口
        content.add(JLb1);
        content.add(jtflduser);
        content.add(JLb2);
        content.add(jtpwdfld);
        content.add(Ok_btn);
        content.add(Cancel_btn);
        frame.pack();
        //設定登陸窗口啓動時出如今屏幕中央位置
        frame.setLocationRelativeTo(null);
        frame.setSize(300,200);
        frame.setVisible(true);
    }//Login() method

    /**
     *實現ActionListener監聽,激活組件響應
     */
     class ActionHandler implements ActionListener{
        public void actionPerformed(ActionEvent e){
            String str1,str2,sqlStr;
            Object obj=e.getSource();
            //得到文本框和密碼框的數據
            str1=jtflduser.getText().trim();
            str2=new String(jtpwdfld.getPassword()).trim();
            try{
                //點擊肯定按鈕
                if(obj.equals(Ok_btn)){
                    if(str1.equals("")){
                        JOptionPane.showMessageDialog(frame,"用戶名不能爲空!");
                        return;
                    }
                    
                    if(result.next()){
                        //彈出對話框提示登陸成功
                        JOptionPane.showMessageDialog(frame,"登陸成功!");
                        //打開圖書管理主頁面
                        bookmain bookmain1=new bookmain();
                        bookmain1.go();
                        //關閉登陸窗口
                        frame.dispose();
                        
                    }else{                      JOptionPane.showMessageDialog(frame,"用戶名或密碼錯誤");
                    }
                    
                }else if(obj.equals(Cancel_btn)){
                    //點擊取消按鈕
                    System.exit(0);
                }
            }catch(ClassNotFoundException ce){
                //捕獲異常
                System.out.println("SQLException:"+ce.getMessage());    
            }
            catch(SQLException ex){
                //捕獲異常
                System.out.println(ex);
            }
            catch (Exception s) {
                //捕獲異常
                s.printStackTrace();
            }
        }
     }
    public static void main(String args[]){
                Login login=new Login();
             }//main            
         }//class ActionHandler

這是用戶界面
3.碼雲及PTA

題目集:多線程

3.1. 碼雲代碼提交記錄

在碼雲的項目中,依次選擇「統計-Commits歷史-設置時間段」, 而後搜索並截圖
必須出現幾個要素:提交日期-用戶名(姓名與學號)-不提交說明

3.2 截圖"多線程"PTA提交列表

須要有兩張圖(1. 排名圖。2.PTA提交列表圖)

3.3 統計本週完成的代碼量

須要將每週的代碼統計狀況融合到一張表中。

周次 行數 新增行數 文件數 新增文件數
1 91 91 5 5
2 504 413 18 13
3 1092 588 28 10
5 1158 129 34 6
6 1539 381 40 6
7 2023 484 49 9
8 2477 454 57 8
9 2709 232 63 6
10 3156 447 70 7
11 3531 375 79 9
12 4083 552 91 12
相關文章
相關標籤/搜索