穷吉201771010119(代码片段)

qiongji qiongji     2023-02-11     399

关键词:

一,理论知识

1.ava通过多线程的并发运行提高系统资源利用率,改善系统性能。

2.假设有两个或两个以上的线程共享 某个对象,每个线程都调用了改变该对象类状态的方法,就会引起的不确定性。

3.多线程并发执行中的问题

◆多个线程相对执行的顺序是不确定的。

◆线程执行顺序的不确定性会产生执行结果的不确定性。

◆在多线程对共享数据操作时常常会产生这种不确定性。

4.多线程并发运行不确定性问题解决方案:引入线程同步机制

二、实验部分

1、实验目的与要求

(1) 掌握线程同步的概念及实现技术; 

(2) 线程综合编程练习

2、实验内容和步骤

实验1:测试程序并进行代码注释。

测试程序1:

l 在Elipse环境下调试教材651页程序14-7,结合程序运行结果理解程序;

l 掌握利用锁对象和条件对象实现的多线程同步技术。

技术分享图片
package 导入;

import java.util.*;
import java.util.concurrent.locks.*;

/**
 * A bank with a number of bank accounts that uses locks for serializing access.
 * @version 1.30 2004-08-01
 * @author Cay Horstmann
 */
public class Bank

   private final double[] accounts;//银行运转的基本数据
   private Lock bankLock;//锁对象
   private Condition sufficientFunds;//

   /**
    * 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);
      bankLock = new ReentrantLock();
      sufficientFunds = bankLock.newCondition();
   

   /**
    * 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) throws InterruptedException
   
      bankLock.lock();
      try
      //锁对象的引用条件对象
         while (accounts[from] < amount)
           sufficientFunds.await();
         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());
         sufficientFunds.signal();
      
      finally
      
         bankLock.unlock();
      
   

   /**
    * Gets the sum of all account balances.
    * @return the total balance
    */
   public double getTotalBalance()
   
      bankLock.lock();//加锁
      try
      
         double sum = 0;

         for (double a : accounts)
            sum += a;

         return sum;
      
      finally
      
         bankLock.unlock();//解锁
      
   

   /**
    * Gets the number of accounts in the bank.
    * @return the number of accounts
    */
   public int size()
   
      return accounts.length;
   
技术分享图片
技术分享图片
package 导入;

/**
 * This program shows how multiple threads can safely access a data structure.
 * @version 1.31 2015-06-21
 * @author Cay Horstmann
 */
public class SynchBankTest

   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();
      
   
技术分享图片
 
 
技术分享图片
 
 

测试程序2:

l  在Elipse环境下调试教材655页程序14-8,结合程序运行结果理解程序;

l  掌握synchronized在多线程同步中的应用。

技术分享图片
package 导入;

import java.util.*;

/**
 * 使用同步原语的具有多个银行帐户的银行
 * @version 1.30 2004-08-01
 * @author Cay Horstmann
 */
public class Bank

   private final double[] accounts;

   /**
    * 构建了银行。
    * @param  账户数量
    * @param 每个账户的初始余额
    */
   public Bank(int n, double initialBalance)
   
      accounts = new double[n];
      Arrays.fill(accounts, initialBalance);
   

   /**
    * 把钱从一个账户转到另一个账户。
    * @param 从账户转出
    * @param 到账转到
    * @param 转帐金额
    */
   public synchronized void transfer(int from, int to, double amount) throws InterruptedException
   
      while (accounts[from] < amount)
         wait();//Object类
      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());
      notifyAll();
   
   /**
    *获取所有帐户余额的总和。
    * @return 总平衡
    */
   public synchronized double getTotalBalance()
   
      double sum = 0;

      for (double a : accounts)
         sum += a;

      return sum;
   

   /**
    * 获取银行中的帐户编号。
    * @return 账户数量
    */
   public int size()
   
      return accounts.length;
   
技术分享图片
技术分享图片
package 导入;

/**
 * 这个程序展示了多线程如何安全地访问一个数据结构,使用同步方法。
 * @version 1.31 2015-06-21
 * @author Cay Horstmann
 */
public class SynchBankTest2

   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();
      
   
技术分享图片
 
技术分享图片

测试程序3:

l  在Elipse环境下运行以下程序,结合程序运行结果分析程序存在问题;

l  尝试解决程序中存在问题。

class Cbank

     private static int s=2000;

     public   static void sub(int m)

    

           int temp=s;

           temp=temp-m;

          try

                     Thread.sleep((int)(1000*Math.random()));

                  

           catch (InterruptedException e)               

                 s=temp;

                 System.out.println("s="+s);

            

 

 

class Customer extends Thread

  public void run()

 

   for( int i=1; i<=4; i++)

     Cbank.sub(100);

   

 

public class Thread3

 public static void main(String args[])

 

   Customer customer1 = new Customer();

   Customer customer2 = new Customer();

   customer1.start();

   customer2.start();

 

源程序运行结果

技术分享图片

修改后的代码

class Cbank



     private static int s=2000;

     public synchronized static void sub(int m)

     

           int temp=s;

           temp=temp-m;

          try 

      Thread.sleep((int)(1000*Math.random()));

    

           catch (InterruptedException e)                

           s=temp;

           System.out.println("s="+s);

   



 

 

class Customer extends Thread



  public void run()

  

   for( int i=1; i<=4; i++)

     Cbank.sub(100);

    

 

public class Thread3



 public static void main(String args[])

  

   Customer customer1 = new Customer();

   Customer customer2 = new Customer();

   customer1.start();

   customer2.start();

  


结果图:
技术分享图片

实验2 编程练习

利用多线程及同步方法,编写一个程序模拟火车票售票系统,共3个窗口,卖10张票,程序输出结果类似(程序输出不唯一,可以是其他类似结果)。

Thread-0窗口售:第1张票

Thread-0窗口售:第2张票

Thread-1窗口售:第3张票

Thread-2窗口售:第4张票

Thread-2窗口售:第5张票

Thread-1窗口售:第6张票

Thread-0窗口售:第7张票

Thread-2窗口售:第8张票

Thread-1窗口售:第9张票

Thread-0窗口售:第10张票

 

public class Demo 
    public static void main(String[] args) 
        Mythread mythread = new Mythread();
        Thread ticket1 = new Thread(mythread);
        Thread ticket2 = new Thread(mythread);
        Thread ticket3 = new Thread(mythread);
        ticket1.start();
        ticket2.start();
        ticket3.start();
    


class Mythread implements Runnable 
    int ticket = 1;
    boolean flag = true;

    @Override
    public void run() 
        while (flag) 
            try 
                Thread.sleep(500);
             catch (InterruptedException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            

            synchronized (this) 
                if (ticket <= 10) 
                    System.out.println(Thread.currentThread().getName() + "窗口售:第" + ticket + "张票");
                    ticket++;
                
                if (ticket > 10) 
                    flag = false;
                
            
        
    


结果图:
技术分享图片
实验总结:这次的试验编程题较比以前写的简单的多,对于我来说这门学课完全是一个新的知识以前所没有接触过得。虽然学起来有的代码写不出,有的理解不了。但还是在尽力去理解。尽管不知道学到了多好但至少接触了一门以前一直没接触的知识。
 


201771010119穷吉

本人学号《面向对象程序设计(java)》第一周学习总结第一部分:课程准备部分填写课程学习平台注册账号,平台名称注册账号博客园:www.cnblogs.comhttps://www.cnblogs.com/qiongji/程序设计评测:https://pintia.cn/[email protected]代码托... 查看详情

穷吉201771010119总复习(代码片段)

实验十八 总复习实验时间2018-12-301、实验目的与要求(1)综合掌握java基本程序结构;(2) 综合掌握java面向对象程序设计特点;(3)综合掌握javaGUI 程序设计结构;(4)综合掌握java多线程编程模型;(5)综合编程练习。2、实验... 查看详情

穷吉201771010119(代码片段)

一,理论知识1.ava通过多线程的并发运行提高系统资源利用率,改善系统性能。2.假设有两个或两个以上的线程共享某个对象,每个线程都调用了改变该对象类状态的方法,就会引起的不确定性。3.多线程并发执行中的问题◆多个... 查看详情

穷吉201771010119*

穷吉201771010119#一,      理论知识学习部分1.标识符:标识符由字母、下划线、美元符号和数字组成,且第一个符号不能为数字。Hello、$1234、程序名、www_123都是合法标识符。可用作:类名,变量名,方法名... 查看详情

学习进度条201771010119穷吉

《2018面向对象程序设计(java)课程学习进度条》 周次编写代码行数发表博客量、博客评论量课堂/课余学习时间(小时)最满意编程任务第一周20~301/04/2九九乘法表第二周40~601/06/4实验一、实验二第三周70~80 4/3 第四周... 查看详情

16穷吉201771010119(代码片段)

实验十六 线程技术 理论知识:程序是一段静态的代码,它是应用程序执行的蓝本。‐进程是程序的一次动态执行,它对应了从代码加载、执行至执行完毕的一个完整过程。多线程是进程执行过程中产生的多条执行线索。... 查看详情

穷吉201771010119#

一,      理论知识学习部分1.标识符:标识符由字母、下划线、美元符号和数字组成,且第一个符号不能为数字。Hello、$1234、程序名、www_123都是合法标识符。可用作:类名,变量名,方法名,数组名,文... 查看详情

201771010119穷吉

实验二Java基本程序设计一,     理论知识学习部分1.标识符:标识符由字母、下划线、美元符号和数字组成,且第一个符号不能为数字。Hello、$1234、程序名、www_123都是合法标识符。可用作:类名,变量名,方... 查看详情

11201771010119穷吉(代码片段)

理论知识:一般将数据结构分为两大类:线性数据结构和非线性数据结构线性数据结构:线性表、栈、队列、串、数组和文件非线性数据结构:树和图。线性表:1.所有数据元素在同一个线性表中必须是相同的数据类型。2.线性... 查看详情

实验六20177101010119穷吉(代码片段)

实验六继承定义与使用理论知识:继承的定义:可以基于已存在的类构造一个新类,继承已存在的类就是复用这些类的方法和域。继承的特点是具有层次结构,子类继承父类的方法和域。由继承Employee类来定义Manager类的格式,关... 查看详情

betascrummeeting2

...0.6.271.1成员今日分工成员分工白玛次仁录制功能测试视频穷吉软件各项功能测试罗松编写博客焦旭超软件各项功能测试  1.2 今日发现了哪些Bug,描述发现Bug的测试用例和Bug的修复情况;1) json字符化失败2) 微... 查看详情

betascrummeeting3

...:2020.6.281.1成员今日分工成员分工白玛次仁录制测试视频穷吉软件各项功能测试,修复bug罗松软件各项功能测试,修复bug焦旭超编写博客1.2 今日发现了哪些Bug,描述发现Bug的测试用例和Bug的修复情况;1)微信授权登陆有时... 查看详情

markdowngit代码片段(代码片段)

查看详情

csharp代码片段(代码片段)

查看详情

javascript代码片段(代码片段)

查看详情

textvisualbasic代码片段(代码片段)

查看详情

sqloracle代码片段(代码片段)

查看详情

swift代码片段(代码片段)

查看详情