嘿嘿,有些标题党了。
这两天一直在看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();
}
}
}
由于笔者也刚刚摸索出一些门道,若有疏漏还望各位指正,大家共同进步哈。