Java——多線程練習


test2.java Ticket.java
package com.java.homework2;
public class test2 {
/*     1.將之前的三個窗口修改為一個窗口買票。
        2.新增加一個退票窗口。
        3.將需求修改為當前所有速7的票都已經賣光了,如果窗口想賣票只有等待退票窗口有一張退票之后,售票窗口才可以買出。*/
        public static void main(String[] args) {
                Ticket ticket=new Ticket(10);
                RefundTicket refundTicket=new RefundTicket(ticket);
                SellTickets selltickets=new SellTickets(ticket);
                Thread t1=new Thread(refundTicket);
                Thread t2=new Thread(selltickets);
                t2.start();
                t1.start();
        }
}
package com.java.homework2;

public class Ticket {
        public int number;
        public Ticket(int number){
                this.number=number;
        }
}

SellTickets.java RefundTicket.java
package com.java.homework2;

public class SellTickets implements Runnable{
        Ticket ticket;
        public SellTickets(Ticket ticket){
                this.ticket=ticket;
        }
        public void run() {
                while(true){
                        try {
                                Thread.sleep(500);    //都用Thread調用
//這些方法都是Object類里面的,Thread類繼承了Object類
                        } catch (InterruptedException e1) {
                                e1.printStackTrace();
                        }
                        synchronized(ticket){                       
                                if(ticket.number<=0||ticket.number>10){
                                        try {
                                                ticket.wait();
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                }
                                        System.out.println("賣出第 "+ticket.number+" 張票");
                                        ticket.number--;
                                        ticket.notify();                       
                                }
                        }
                }
}
package com.java.homework2;
public class RefundTicket implements Runnable {
        Ticket ticket;

        public RefundTicket(Ticket ticket) {
                this.ticket = ticket;
        }

        public void run() {
                while (true) {
                        try {
                                Thread.sleep(1000);        //都用Thread調用
                        } catch (InterruptedException e1) {
                                e1.printStackTrace();
                        }
                        synchronized (ticket) {
                                if (ticket.number ==10||ticket.number<0) {
                                        try {
                                                ticket.wait();
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                }
                                        ticket.number++;
                                        System.out.println("收到第 " + ticket.number + " 張退票");
                                        ticket.notify();
                                }
                        }
                }
}


test3.java Flag.java
package com.java.homework3;
/*創建2個線程,每個線程都打印從0到99這100個數字,
* 線程之間不會出現交叉亂序打印,而是順序地打印。*/
public class test3 {

        public static void main(String[] args) {
                Flag fl=new Flag();
                print1 p1=new print1("No1.",fl);
                print2 p2=new print2("No2.",fl);
                Thread t1=new Thread(p1);
                Thread t2=new Thread(p2);
                t1.start();
                t2.start();
        }
}
package com.java.homework3;

public class Flag {
        public boolean flag;   //控制交叉打印
        public int num=0;      //控制打印的數
}

print1.java print2.java
package com.java.homework3;

public class print1 implements Runnable {
        String nameString = Thread.currentThread().getName();
        Flag flag;

        public print1(String nameString, Flag flag) {
                this.nameString = nameString;
                this.flag = flag;
        }

        public void run() {
                while (true) {
                        synchronized (flag) {
                                if (flag.flag) {
                                        try {
                                                flag.wait();
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                }
                                if (flag.num <= 100) {
                                        System.out.println(nameString + "這是第 " + flag.num + " 個數");
                                        flag.num++;
                                }
                                flag.notify();
                                flag.flag = true;
                        }
                }
        }
}
package com.java.homework3;

public class print2 implements Runnable {
        String nameString;
        Flag flag;

        public print2(String nameString, Flag flag) {
                this.nameString = nameString;
                this.flag = flag;
        }

        public void run() {
                while (true) {
                        synchronized (flag) {
                                if (!flag.flag) {
                                        try {
                                                flag.wait();
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                }
                                if (flag.num <= 100) {
                                        System.out.println(nameString + "這是第 " + flag.num + " 個數");
                                        flag.num++;
                                }
                                flag.notify();
                                flag.flag = false;
                        }
                }
        }
}


test4.java Bullet.java
package com.java.homework4;
/**
* 3、采用Java 多線程技術,設計實現一個符合生產者和消費者問題的程序。
* 對一個對象(槍膛)進行操作,其最大容量        是1顆子彈。
* 生產者線程是一個壓入線程,它不斷向槍膛中壓入子彈;消費者線程是一個射出線程,它不斷從槍膛中射出子彈。  
* 要求:    (1)給出分析過程說明。    
* (提示:這是個生產者與消費者問題,也是線程的同步問題,
*  為了防止兩個線程訪問一個資源時出現忙等待,要使用的wait-notify函數,是兩個線程交替執行; )  
* (2)程序輸出,要模擬體現對槍膛的壓入和射出操作;   
* (3)設計程序時應考慮到兩個線程的同步問題。
*/
public class test4 {

        public static void main(String[] args) {
                Bullet bullet=new Bullet();
                AddBullet ab=new AddBullet(bullet);
                ShootBullet sb=new ShootBullet(bullet);
                Thread t1=new Thread(ab);
                Thread t2=new Thread(sb);
                t1.start();
                t2.start();
        }
}
package com.java.homework4;

public class Bullet {
        public boolean flag;   //控制是否有子彈
}

AddBullet.java ShootBullet.java
package com.java.homework4;
public class AddBullet implements Runnable{
        public Bullet bullet;
        public AddBullet(Bullet bullet){
                this.bullet=bullet;
        }

        public void run() {
                while(true){
                        synchronized(bullet){
                                if(bullet.flag){
                                        try {
                                                bullet.wait();
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                }
                                try {
                                        Thread.sleep(1000);
                                } catch (InterruptedException e) {
                                        e.printStackTrace();
                                }
                                System.out.println("子彈上膛~~~~");
                                bullet.notify();
                                bullet.flag=true;
                        }
                }
        }
}
package com.java.homework4;
public class ShootBullet implements Runnable{
        public Bullet bullet;
        public ShootBullet(Bullet bullet){
                this.bullet=bullet;
        }

        public void run() {
                while(true){
                        synchronized(bullet){
                                if(!bullet.flag){
                                        try {
                                                bullet.wait();
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                }
                                try {
                                        Thread.sleep(1000);
                                } catch (InterruptedException e) {
                                        e.printStackTrace();
                                }
                                System.out.println("射擊!!!");
                                bullet.notify();
                                bullet.flag=false;
                        }
                }
        }
}



test5.java
/*手動新建一個計時器,並且自己創建一個任務。然后嘗試使用如下定時器在固定的時間內去執行你想要到任務。
void schedule(TimerTask task, Date time)
          安排在指定的時間執行指定的任務。
void schedule(TimerTask task, Date firstTime, long period)
          安排指定的任務在指定的時間開始進行重復的固定延遲執行。
void schedule(TimerTask task, long delay)
          安排在指定延遲后執行指定的任務。
void schedule(TimerTask task, long delay, long period)
          安排指定的任務從指定的延遲后開始進行重復的固定延遲執行。
void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
          安排指定的任務在指定的時間開始進行重復的固定速率執行。
void scheduleAtFixedRate(TimerTask task, long delay, long period)
          安排指定的任務在指定的延遲后開始進行重復的固定速率執行。
*/
public class test5 {

        public static void main(String[] args) {
                Timer timer=new Timer();
                Mytask mytask=new Mytask();
                Date date=new Date();
                GregorianCalendar c1=new GregorianCalendar(2017,2,18,14,60,40);  //月份默認從0開始
                //GregorianCalendar 是 Calendar 的一個具體子類,提供了世界上大多數國家/地區使用的標准日歷系統。
                //GregorianCalendar(int year, int month, int dayOfMonth, int hourOfDay, int minute, int second) ;
                date=c1.getTime();   //這個方法是夫類的,子類繼承了夫類,所以也能調用
 //Date getTime();  //返回一個表示此 Calendar 時間值(從歷元至現在的毫秒偏移量)的 Date 對象
                System.out.println(date);
                timer.scheduleAtFixedRate(mytask, date, 3000);
        }

}
class Mytask extends TimerTask{

        public void run() {
                System.out.println("Mytask.run()");
        }

}


這個時間要設置成運行程序的時間往后,不然會執行好多次Mytask的任務;設置成運行程序時間之后,run方法會在到時間開始執行


















免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM