線程練習題

第一題編寫一個多線程程序:

要求 
    1.創建兩個線程 線程的名字分別爲網店1 和網店2 主線程的線程名更改爲 實體店
    2.2個網店分別賣100個乒乓球每賣出一個打印正在賣出第幾個, 實體店賣出103.實體店一旦賣完其他兩個網店就停止銷售
package com.yang.day11.title01;

/**
 * @author WangYang
 * @version 1.0
 * @create 2020-02-14 19:00
 * <p>
 * 要求
 * 1.創建兩個線程 線程的名字分別爲網店1 和網店2 主線程的線程名更改爲 實體店
 * 2.2個網店分別賣100個乒乓球每賣出一個打印正在賣出第幾個, 實體店賣出10個
 * 3.實體店一旦賣完其他兩個網店就停止銷售
 */

public class OnlineStore implements Runnable {

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            System.out.println(Thread.currentThread().getName() + "正在賣出第" + i+ "個");
        }
    }
}

class TestOnlineStore {
    public static void main(String[] args) {

        //主線程的線程名更改爲 實體店
        Thread.currentThread().setName("實體店:");

        //創建兩個線程 線程的名字分別爲網店1 和網店2
        OnlineStore os = new OnlineStore();
        Thread t1 = new Thread(os, "網店1:");
        Thread t2 = new Thread(os, "網店2:");
        //設置t1 t2 線程爲守護線程、
        t1.setDaemon(true);
        t2.setDaemon(true);
        t1.start();
        t2.start();

        //主線程賣出10後,其他線程停止銷售
        for (int i = 0; i < 10; i++) {
            System.out.println(Thread.currentThread().getName() + "正在賣出第" + (i+1) + "個");
        }


    }
}

第二題:分析以下需求,並用代碼實現

一共有1000張電影票,可以在兩個窗口領取,假設每次領取的時間爲300毫秒,
 要求:請用多線程模擬賣票過程並打印剩餘電影票的數量
package com.yang.day11.title02;

/**
 * @author WangYang
 * @version 1.0
 * @create 2020-02-14 20:32
 *
 * 一共有1000張電影票,可以在兩個窗口領取,假設每次領取的時間爲300毫秒,
 *  要求:請用多線程模擬賣票過程並打印剩餘電影票的數量
 */
public class SaleWindow implements Runnable{
    //一共有1000張電影票
    private int ticket = 1000;
    @Override
    public void run() {
        while (true){
            synchronized (this){ //此時鎖對象就是SaleWindow對象
                if(ticket > 0){
                    //假設每次領取的時間爲300毫秒
                    try {
                        Thread.sleep(300);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.print(Thread.currentThread().getName() + "賣出第" + ticket +"張票");
                    ticket--;
                    System.out.println(",剩餘"+ticket+"張票");
                }
            }

        }
    }
}

class getTicket{
    public static void main(String[] args) {
        //在兩個窗口領取
        SaleWindow sw = new SaleWindow();
        Thread w1 = new Thread(sw,"窗口1:");
        Thread w2 = new Thread(sw,"窗口2:");
        w1.start();
        w2.start();

    }
}

第三題:使用多線程解決以下問題

有一個包包的數量爲100個。分別從實體店和官網進行售賣!
要求使用多線程的方式,分別打印實體店和官網賣出包包的信息!
分別統計官網和實體店各賣出了多少個包包,例如:
官網共賣出了45個
實體店共賣出了55個
package com.yang.day11.title03;

/**
 * @author WangYang
 * @version 1.0
 * @create 2020-02-14 20:45
 * <p>
 * 有一個包包的數量爲100個。分別從實體店和官網進行售賣!
 * 要求使用多線程的方式,分別打印實體店和官網賣出包包的信息!
 * 分別統計官網和實體店各賣出了多少個包包,例如:
 * 官網共賣出了45個
 * 實體店共賣出了55個
 */
public class Title3 implements Runnable {
    //包包的數量爲100個
    private int total = 100;
    //分別統計官網和實體店各賣出了多少個包包
    private int net = 0;
    private int shop = 0;

    @Override
    public void run() {
        while (true) {
            synchronized (this) {
                if (total > 0) {
                    try {
                        Thread.sleep(30);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    //售賣
                    total--;
                    if ("實體店".equals(Thread.currentThread().getName())) {
                        shop++;
                    } else {
                        net++;
                    }
                } else {
                    if ("實體店".equals(Thread.currentThread().getName())) {
                        System.out.println("實體店共賣出了" + shop + "個");
                        break;
                    } else {
                        System.out.println("官網共賣出了" + net + "個");
                        break;
                    }



                }
            }
        }
    }
}

class TestDemo {
    public static void main(String[] args) {

        Title3 rn = new Title3();
        //分別從實體店和官網進行售賣!
        Thread net = new Thread(rn, "官網");
        Thread shop = new Thread(rn, "實體店");

        net.start();
        shop.start();
    }
}
解決面試題java兩種線程,一個線程打印 1~52,另一個線程打印字母A-Z,打印順序爲12A34B56C……5152Z。
package com.yang.day11.title04;

import java.util.zip.CheckedOutputStream;

/**
 * @author WangYang
 * @version 1.0
 * @create 2020-02-14 21:07
 * <p>
 * 解決面試題java兩種線程,一個線程打印 1~52,另一個線程打印字母A-Z,打印順序爲12A34B56C……5152Z。
 */
public class Title04 {

    public static void main(String[] args) {
        Object obj = new Object();
        //打印數字
        new Thread() {
            @Override
            public void run() {
                int count = 0;
                synchronized (obj) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    for (int i = 1; i < 53; i++) {
                        System.out.print(i);
                        count++;

                        if (count >= 2) {
                            obj.notifyAll();
                            try {
                                obj.wait();
                                count = 0;
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }

                }
            }
        }.start();

        //打印字符
        new Thread() {


            @Override
            public void run() {
                int count = 0;
                synchronized (obj) {
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    for (int i = 65; i < 91; i++) {
                        System.out.print((char) i);
                        count++;
                        if (count >= 1) {
                            obj.notifyAll();
                            try {
                                obj.wait();
                                count = 0;
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            }
        }.start();
    }
}

發佈了12 篇原創文章 · 獲贊 5 · 訪問量 933
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章