原創(都是自己寫): 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資源後立刻聯合線程“倉庫管理員”,也就是讓“裝運工”一直等到“倉庫管理員”打開倉庫才能開始搬運貨物。 |
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()); } } }
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);//設置線程的優先級,首先肯定是student1和student2先睡覺,也就是優先級比老師高 classroom.student2.setPriority(9); classroom.teacher.setPriority(8);//學生睡了纔有老師喊上課,這三個優先級就是先弄好最開始的線程的順序,之後才能正確的執行接下來的內容 classroom.student1.start();//線程開始 classroom.student2.start(); classroom.teacher.start(); } }
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)) {//如果沒有1張10快和一張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(); } } 運行結果:
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();//司機的線程開始了 } }
|
實驗六 線程與集合
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.