實驗六 線程與集合

原創(都是自己寫):

1.用鏈表來存儲內容,有一個Student類,屬性有姓名,年齡,身高,姓名按照字典序排序,如果姓名相同再按年齡排序,如果年齡相同按身高排序。

2.要求3個線程:student1、student2、teacher,其中student1準備睡10分鐘後再開始上課,student2準備睡一小時後再開始上課。Teacher在輸出3句”上課”後,吵醒休眠的線程student1;student1被吵醒後,負責再吵醒休眠的線程studen2。

3.模擬售票處有一張5元錢,三個人排隊買票,電影票五元一張,張某(排第一,拿20元一張的新人民幣)、李某(排第二,拿10元一張的新人民幣)和趙某(排第三,拿一張5元的人民幣)按順序買電影票。

4. 編寫一個Java應用程序,在主線程中再創建3個線程:“運貨司機”“裝運工”和“倉庫管理員”。要求線程“運貨司機”佔有CPU資源後立刻聯合線程“裝運工”,也就是讓“運貨司機”一直等到“裝運工”完成工作才能開車,而“裝運工”佔有CPU資源後立刻聯合線程“倉庫管理員”,也就是讓“裝運工”一直等到“倉庫管理員”打開倉庫才能開始搬運貨物。

  1. 源程序代碼(2個類,Student.java,Demo.java(展示類)

Student.java:

public class Student  {

   public String name;//姓名  

   public int age;//年齡

   public int height;//身高

   Student(String name, int age,int height) {//構造函數,進行初始化

     this.name = name;

     this.age = age;

     this.height = height;

   }

   public String toString() {//轉字符串方法

     return "姓名:"+this.name+",年齡:"+this.age+",身高:"+this.height;

   }

}

Demo.java:

import java.util.*;

public class Demo {

   public static void insert(List<Student> list,Student s1) {//按要求的排序進行插入

      ListIterator<Student> it = list.listIterator();

      while(it.hasNext()) {

          Student s2 = it.next();

          if(s1.name.compareTo(s2.name) == 0){//如果姓名一樣,按身高排序

             if(s1.height == s2.height) {//如果身高一樣,按年齡排序

                if(s1.age == s2.age) {//如果年齡也一樣就直接插在他後面就好,沒有差別,並跳出

                   it.add(s1);

                   break;

                }else if(s1.age < s2.age) {//如果是年齡小,就插入到他前面,並跳出

                   it.previous();

                    it.add(s1);

                   break;

                }

             }else if(s1.height < s2.height) {//如果身高小,就插入到他前面,並跳出

                it.previous();

                it.add(s1);

                break;

             }

          }else if(s1.name.compareTo(s2.name)<0) {//如果名字的字典序小,就插入到他前面,並跳出

             it.previous();

             it.add(s1);

             break;

          }

      }

      if(it.hasNext() == false) {//如果這時候沒有元素說明還沒插入,那就說明這個學生的按要求的排序裏是最大的,插在最後面

          it.add(s1);

      }

   }

   public static void main(String[] args) {

      LinkedList<Student> list = new LinkedList<Student>();

      // 創建學生對象

      Student s1 = new Student("huassdfadasngxiangping",22,165);

      Student s2 = new Student("huafdgngxiangping",23,160);

      Student s3 = new Student("huangxiangping",23,155);

      Student s4 = new Student("chesdfsnsdfsdkaiwen",20,175);

      Student s5 = new Student("kebsdfsdingda",30,166);

      Student s6 = new Student("hejiahsdfao",33,188);

      Student s7 = new Student("tengfesdfsngda",29,199);

     

      // 添加元素對象

      list.add(s1);

      list.add(s2);

      list.add(s3);

      list.add(s4);

      list.add(s5);

      list.add(s6);

      list.add(s7);

      //重寫sort的排序方式

      Collections.sort(list, new Comparator<Student>() {

          public int compare(Student s1, Student s2) {

               if(s1.name.compareTo(s2.name)==0){//如果姓名相同,按年齡排序

                  if(s1.age-s2.age==0) {//如果年齡相同,按身高排序

                     return s1.height-s2.height;

                  }

                  return s1.age-s2.age;

                }

               return s1.name.compareTo(s2.name);

          }

      });

      Student s8 = new Student("leichong", 27,170);

      insert(list,s8);//插入數據

      //遍歷集合

      for(Student s : list) {

          System.out.println(s.toString());

      }

   }

}

 

  1. 源程序代碼(2個類,ClassRoom.java,Demo.java(展示類)

ClassRoom.java:

public class ClassRoom implements Runnable{

   Thread student1,student2,teacher;

   ClassRoom(){//構造函數,建立三個線程

     student1 = new Thread(this);

     student2 = new Thread(this);

     teacher = new Thread(this);

   }

   public void run() {//重寫run的方法

     String name = Thread.currentThread().getName();//當前線程的名字

     if(name.equals("student1")) {//student1的內容操作

        try {

           System.out.println("我是"+name+"在教室上課,想睡10分鐘後再上課");

           Thread.sleep(1000*10);//停止10分鐘

        }

        catch(InterruptedException ex){

           System.out.println(name+"teacher叫醒了");//如果中斷就輸出這個內容

        }

        student2.interrupt();//student2被叫醒

        System.out.println(name+"開始上課了");

     }else if(name.equals("student2")) {//student2的內容操作

        try {

           System.out.println("我是"+name+"在教室上課,想睡1小時後再上課");

           Thread.sleep(1000*60*60);//停止1小時

        }

        catch(InterruptedException ex){

           System.out.println(name+"student1叫醒了");//如果中斷就輸出這個內容

           student2.interrupt();//中斷student2

        }

        System.out.println(name+"開始上課了");

     }else if(name.equals("teacher")) {//teacher的內容操作

        for(int i=1;i<=3;++i) {

           System.out.println(name+"喊:上課!");

           try {

             Thread.sleep(1000);

           }

           catch(InterruptedException ex){

            

           }

        }

        student1.interrupt();//老師叫醒學生1

     }

   }

}

Demo.java

public class Demo {

   public static void main(String[] args) {

     ClassRoom classroom = new ClassRoom();

     classroom.student1.setName("student1");//給各個線程進行命名

     classroom.student2.setName("student2");

     classroom.teacher.setName("teacher");

     classroom.student1.setPriority(10);//設置線程的優先級,首先肯定是student1student2先睡覺,也就是優先級比老師高

     classroom.student2.setPriority(9);

     classroom.teacher.setPriority(8);//學生睡了纔有老師喊上課,這三個優先級就是先弄好最開始的線程的順序,之後才能正確的執行接下來的內容

     classroom.student1.start();//線程開始

     classroom.student2.start();

     classroom.teacher.start();

   }

}

 

 

  1. 源程序代碼(2個類,TicketCinema.java,Demo.java(展示類)

TicketCinema.java:

public class TicketCinema implements Runnable{

    Thread zhang,li,zhao;

    public int twentyNum=0;//20元的數量

    public int fiveNum=1;//5元的數量

    public int tenNum=0;//10元的數量

    TicketCinema(){//構造函數,建立三個線程

        zhang = new Thread(this);

        li = new Thread(this);

        zhao = new Thread(this);

    }

    public void run() {

        String name = Thread.currentThread().getName();

        if(name.equals("張某")) {

            buyTicket(20);//買票

        }else if(name.equals("李某")) {

            buyTicket(10);//買票

        }else if(name.equals("趙某")) {

            buyTicket(5);//買票

        }

    }

    public synchronized void buyTicket(int money) {//買票方法

        String name = Thread.currentThread().getName();

        if(money == 20) {

            while(!(tenNum>=1&&fiveNum>=1)) {//如果沒有110快和一張5快以上那麼他就得等待

                try {

                   System.out.println(name+"在一邊等待買票......");

                   wait();

                }

                catch(InterruptedException ex) {

                  

                }

            }

            tenNum-=1;

            fiveNum-=1;

            twentyNum+=1;

            System.out.println(name+"20元買一張票,找回15");

        }else if(money == 10) {

            while(fiveNum<1) {//如果一張五塊都沒有那他就要等待

                try{

                   System.out.println(name+"在一邊等待買票......");

                   wait();

                }

                catch(InterruptedException ex) {

                  

                }

            }

            fiveNum-=1;

            tenNum+=1;

            System.out.println(name+"10元買一張票,找回5");

        }else if(money == 5) {

            fiveNum+=1;

            System.out.println(name+"5元買一張票,找回0");

        }

        notifyAll();

    }

}

Demo.java:

public class Demo {

    public static void main(String[] args) {

        TicketCinema  ticket = new TicketCinema();

        ticket.zhang.setName("張某");

        ticket.li.setName("李某");

        ticket.zhao.setName("趙某");

        ticket.zhang.start();//線程開始

        ticket.li.start();

        ticket.zhao.start();

    }

}

運行結果:

 

  1. 源程序代碼(2個類,WareHouse.java,Demo.java(展示類)

WareHouse.java:

public class WareHouse implements Runnable{

   Thread driver,remover,admin;

   WareHouse(){//構造函數,建立三個線程

     driver = new Thread(this);

     remover = new Thread(this);

     admin = new Thread(this);

   }

   public void run() {//重寫run方法

     String name = Thread.currentThread().getName();//獲取當前線程的名字

     if(name.equals("運貨司機")) {//貨運司機的操作

        System.out.println("我是"+name+",我在等裝運工的工作完成了才能開車!");

        try {

           remover.start();//裝運工線程開始,叫裝運工了

           remover.join();//聯合裝運工線程。跟他是一條線了

        }

        catch(InterruptedException ex){

           System.out.println("過程出現問題!");

        }

        System.out.println("貨運司機開始開車");

     }else if(name.equals("裝運工")) {//裝運工的操作

        System.out.println("我是"+name+",我在等倉庫管理員的開門才能裝運貨物!");

        try {

           admin.start();//倉庫管理員線程開始,叫倉庫管理員了

           admin.join();//聯合倉庫管理員線程,跟他是一條線了

        }

        catch(InterruptedException ex){

           System.out.println("過程出現問題!");

        }

        System.out.println("裝運工開始裝運貨物!");

     }else if(name.equals("倉庫管理員")) {//倉庫管理員的操作

        System.out.println("我是"+name+",我正在開門!");

        System.out.println("打開倉庫門要3");

        try {

           admin.sleep(1000);

           System.out.println("3");

           admin.sleep(1000);

           System.out.println("2");

           admin.sleep(1000);

           System.out.println("1");

        }

        catch(InterruptedException ex){

           System.out.println("過程出現問題!");

        }

        System.out.println("倉庫門打開了!");

     }

   }

}

Demo.java:

public class Demo {

   public static void main(String[] args){

     WareHouse warehouse = new WareHouse();

     warehouse.driver.setName("運貨司機");//給線程進行命名

     warehouse.remover.setName("裝運工");

     warehouse.admin.setName("倉庫管理員");

     warehouse.driver.start();//司機的線程開始了

   }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章