线程练习题

第一题编写一个多线程程序:

要求 
    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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章