多线程问题,你搞得定吗?

嘿嘿,有些标题党了。

 

这两天一直在看java多线程的相关内容,略有收获。

基础理论就不罗列了,网上好多。以一个问题来阐述吧:

(若是刚接触多线程的新手,建议先熟悉“生产者--消费者”的经典实现)

 

问题:数字1、2、3……100作循环,跑起4个线程,每个线程绑定一个集合来抢数字。

            若有线程抢够25个数字,则退出争抢,其它线程继续,直到100个数字分完。

 

经笔者各种学习、磨蹭之后,得到如下解决方案:

//实现类,封装list
class Option implements Runnable{
 List<Integer> list;
 static Integer i; //类级别的数字i
 public Option(List<Integer> list){
  this.list = list;
 }
 @Override
 public void run() {
  try {
   for(i=1;i<=100;){
    synchronized (Option.class) {
     Thread.sleep(1); //此处必须要睡一会儿
     while(list.size()==25){
      Thread.yield();
      System.out.println(list.toString()); //打印输出list
      return;
     }
     list.add(i);
     //System.out.println(Thread.currentThread().getName()+"-->"+i); //打印单个数字(测试用)
     i++;
    }
   }
   System.out.println(list.toString()); //打印输出list
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}

 

//测试类
public class Test1 {
	public static void main(String[] args) {
		try {
			List<Integer> list1 = new ArrayList<Integer>();
			List<Integer> list2 = new ArrayList<Integer>();
			List<Integer> list3 = new ArrayList<Integer>();
			List<Integer> list4 = new ArrayList<Integer>();
			Thread t1 = new Thread(new Option(list1));
			Thread t2 = new Thread(new Option(list2));
			Thread t3 = new Thread(new Option(list3));
			Thread t4 = new Thread(new Option(list4));
			t1.start();
			t2.start();
			t3.start();
			t4.start();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}


由于笔者也刚刚摸索出一些门道,若有疏漏还望各位指正,大家共同进步哈。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值