java多线程问题

火焰长岛冰茶 2016-09-30 10:10:16
假设抽奖箱中有100个号码(依次从1到100),开启两个线程, 共随机抽选出10个号码,并在控制台上打印出两个线程分别抽选了哪些号码? 提示:(两个线程不能抽取同一个号码,已经抽取的号码不能再次抽取; 不限定两个线程抽取的个数一样,总共抽选10个即可,线程名自定义)。
问题是,我按照多线程的正规写法用了同步代码块,锁对象也是类的字节码文件,但是输出的时候每次只有一个线程进行输出,用了sleep()方法也切换不了线程,求助哪里出了问题?下面是代码:
public class ChouJiang {

public static void main(String[] args) {
Thread t1 = new Chou();
t1.setName("线程一");
Thread t2 = new Chou();
t2.setName("线程二");

t1.start();
t2.start();
}

}

class Chou extends Thread {
// 100个号码(依次从1到100)

static ArrayList<Integer> list = new ArrayList<Integer>();
static HashSet<Integer> hs = new HashSet<Integer>();
static {

for (int i = 1; i <= 100; i++) {
list.add(i);
}

while (hs.size() < 10) {
Random r = new Random();
int j = r.nextInt(100) + 1; // 随机数获取1-100
hs.add(j);
}
}

@Override
public void run() {
// 共随机抽选出10个号码, 并在控制台上打印出两个线程分别抽选了哪些号码
// * 提示:(两个线程不能抽取同一个号码,已经抽取的号码不能再次抽取;
synchronized (ChouJiang.class) {
while (list.size() > 90) {
for (Integer num : hs) {
try {
Thread.sleep(1000);
System.out.println(Thread.currentThread().getName()
+ "抽取了:" + num + "号球");
list.remove(num);
} catch (Exception e) {
}

}

}
}

}

}
类采用的是继承Thread,怀疑是不是创建了两个Thread,出现了两个对象的问题,但是用了实现runnable接口结果还是一样的。
...全文
301 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
tomorrow_C 2016-10-04
  • 打赏
  • 举报
回复
你的锁放在了遍历集合的外面,也就是说,一个线程抢到后会直接把集合遍历完,建议不要用这种方式,
当作看不见 2016-10-01
  • 打赏
  • 举报
回复
synchronized 只有当一个线程执行完毕是,另一个线程才会开始工作,所以,第一个线程一直输出,输出完毕,也就没第二个线程的事了

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧