面了一家,笔试机试写1000个线程抢100张票,写的应该没问题吧
java吧
全部回复
仅看楼主
level 7
2021年10月13日 11点10分 1
level 7
public class ThreadTest {
@Test
public void test() {
Vector<Thread> deadThreads = new Vector<>();
Object o = new Object();
Tick tick = new Tick();
for (int i = 0; i < 1000; i++) {
new Thread(() -> {
synchronized (o) {
while (tick.num > 0) {
tick.num--;
System.out.println("线程 " + Thread.currentThread().getName() + "抢到了第" + (100 - tick.num) + "张票!");
try {
Thread.sleep(50);
o.notifyAll();
o.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
o.notifyAll();
}
System.out.println("线程" + Thread.currentThread().getName() + "done!");
deadThreads.add(Thread.currentThread());
}).start();
}
System.out.println("线程创建完毕");
try {
Thread.sleep(30000);
System.out.println(deadThreads.size());
Thread.sleep(6000000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
static class Tick {
public Integer num = 100;
}
}
2021年10月13日 11点10分 2
level 7
有啥性能或者线程安全隐患?
2021年10月13日 11点10分 3
@璐村惂鐢ㄦ埛_0USUEQ6馃惥 再说说notifyall的影响,你现在因为加了个lock,其实是一个线程处理,当一个线程处理完了再唤醒其他线程争抢,一开始唤醒999个线程,再唤醒998个,,依次类推,这个是相当致命的。叫啥词我给忘了。有兴趣可以看看,
2021年10月14日 07点10分
性能就是,sync(o)的时候,线程都串行执行了,并没有并发执行。 还有,写多线程并发的时候,不要用e.printstackTrace() 跟system.out.print这种写法。可以去看一下源码。 最好是用cas这种轻量级的自旋锁实现。而不是sync这种重量级的锁。
2021年10月14日 05点10分
@璐村惂鐢ㄦ埛_0USUEQ6馃惥 假设机器的cpu是8核16线程,那么你其实能达到的最高的并发量就是16。 也就是说你自旋只会有16个线程自旋,其他的线程并没有获取到cpu的资源,等到某个线程自旋结束,处理完了。再切换到下个线程去做。
2021年10月14日 07点10分
@肥猴丶 这么多线程自旋不会耗费资源吗
2021年10月14日 05点10分
level 10
抄哪里的[捂嘴笑]
2021年10月13日 11点10分 4
自己写的
2021年10月13日 11点10分
@璐村惂鐢ㄦ埛_0USUEQ6馃惥 ticket加volitiel关键字没有
2021年10月13日 12点10分
@民以食为天👻 你不会不知道synchronized能保证可见性吧[滑稽]
2021年10月13日 12点10分
@璐村惂鐢ㄦ埛_0USUEQ6馃惥 是的,sync出锁自动刷主存了
2021年10月13日 12点10分
level 6
用completefuture吧,感觉你这样写不好看
2021年10月13日 12点10分 5
主线程并不需要获取异步结果,如果是main方法入口的话主线程结束异步线程也会打印的[吐舌]
2021年10月13日 12点10分
level 11
工作几年了?
2021年10月13日 12点10分 6
刚转正
2021年10月13日 12点10分
level 7
这个并不怎么好,要用线程池,你这直接起了1000个线程并行
2021年10月13日 12点10分 7
题目不是说要起1000个线程?
2021年10月13日 16点10分
@gshjsducjjdsj 只是分开成1000个线程,并不是1000个线程同时执行,1000个线程可以起一个30个线程的线程池,然后1000个线程放队列里面执行
2021年10月13日 16点10分
level 11
推荐用线程池,最大数量给CPU核心数*2-1比较合适 [太开心]
2021年10月13日 12点10分 8
题目不是说要起1000个线程?
2021年10月13日 16点10分
level 5
用AtomicInteger会不会更好一点
2021年10月13日 12点10分 9
能保证原子性吗?我真不知道,只知道能保证可见性
2021年10月14日 04点10分
@沉管吸♋ AtomicInteger是用CAS保证原子性的
2021年10月14日 05点10分
level 7
有很多可以优化的点吧…
2021年10月13日 16点10分 11
level 7
1.用线程池
2021年10月13日 16点10分 12
level 7
while循环没必要
2021年10月13日 16点10分 13
level 7
没必要用wait notifyall
2021年10月13日 16点10分 14
level 1
楼主是来炫耀的[笑眼]
2021年10月13日 17点10分 18
1 2 尾页