线程和安全小案例

有100份礼品,小红,小明两人同时发送,

当剩下的礼品小于10份的时候则不再送出

(join 意思是) 主线程等待子线程跑完(小红 小明跑完)

package Demo1;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class demo1 {
    public static void main(String[] args) throws Exception {
        // 目标:有100份礼品,小红,小明两人同时发送,当剩下的礼品小于10份的时候则不再送出,
        // 利用多线程模拟该过程并将线程的名称打印出来。并最后在控制台分别打印小红,小明各自送出多少分礼物.
        // 1、食00份礼品到程序中来。

        List gift = new ArrayList<>();
        String [] name={"口红","包包","剃须刀","皮带","手表"};
        Random r=new Random();
        for (int i = 0; i < 100; i++) {
            gift.add(name[r.nextInt(name.length)]+(i+1));

        }
        System.out.println(gift);

      SendThread xh= new SendThread(gift,"小红");
         xh.start();
        String h= xh.getName();
      SendThread xm=new SendThread(gift,"大明");
      String dm=xm.getName();
       xm.start();

        //等待子线程跑完
        xh.join();
        xm.join();

        System.out.println(h+"一共:"+xh.getCount());
        System.out.println(dm+"一共:"+xm.getCount());
    }
}
package Demo1;

import java.util.List;
import java.util.Random;
import java.util.SplittableRandom;

public class SendThread extends Thread{

  private  List  gift;
  private int count;
  public SendThread(List gift, String name){
      super(name);
      this.gift=gift;
  }


    @Override
    public void run() {
        super.run();
        String name=Thread.currentThread().getName();
        //实现安全问题
        Random r=new Random();
        while (true) {
            synchronized (gift) {
                if (gift.size()<10){
                    break;
                }
            String  rs= gift.remove(r.nextInt(gift.size()));
                System.out.println(name+"发出了:"+rs);
                ++count;
            }
        }
    }

    public int getCount() {
        return count;
    }

    public void setCount(int count) {
        this.count = count;
    }
}

你可能感兴趣的:(windows)