Discuss / Java / 要模拟并发只能通过睡眠么?

要模拟并发只能通过睡眠么?

Topic source

🌙

#1 Created at ... [Delete] [Delete and Lock User]

要模拟并发执行的效果,我们可以在线程中调用Thread.sleep(),强迫当前线程暂停一段时间:

如果,不使用睡眠 结果感觉 都是正确的

是不是不用加锁呢?

🌙

#2 Created at ... [Delete] [Delete and Lock User]

创建100个线程,问题就出来了....

for (int i = 0; i < 100; i++) {
Thread t2 = new Thread(() -> {
System.out.println("thread start...");
System.out.println("thread end...");
});
t2.start();
}

// t.start();
System.out.println("main end...");

打印结果

...

thread start...

thread start...

thread end...

main end...

thread start...

...

线程多了就乱套了

🌙

#3 Created at ... [Delete] [Delete and Lock User]

一个线程执行一半的时候会被其他线程强行插入

保持热爱

#4 Created at ... [Delete] [Delete and Lock User]

调用t.start()之后就是并发执行了,
用sleep暂缓一下只是为了让你这个更好看到,并发时程序的执行效果

如果,不使用睡眠 结果感觉 都是正确的

你这说的是个什么玩意,就四条打印语句,怎么就扯上正确错误了?还加锁?共享资源在哪?你往哪加?

C

#5 Created at ... [Delete] [Delete and Lock User]
一个线程执行一半的时候会被其他线程强行插入

这就是并发,线程由cpu调度,后续看不明白的可以回头重新看本文

🌙

#6 Created at ... [Delete] [Delete and Lock User]

没有按照我想要的结果打印,就是错误的。

不加sleep,没发模拟出来,当然加锁也不行,这个是cup决定的

你可以把你需要打印的内容写成一个方法(作为一种资源),然后把方法加锁就可以了

□▼□

#8 Created at ... [Delete] [Delete and Lock User]

哥们,如果你代码没按你的想法跑,这表示你写错了而不是代码跑错了.....你想模拟并发,但实际上多线程的运行就是在很多的时间片上分运行的资源给到每个线程去跑,这个叫时间片轮转.

而在多核处理器的系统中,多个线程可以在不同的处理器核心上同时执行。这就是真正的并行执行。但即使在这种情况下,每个核心仍然会在其上运行的所有线程之间进行切换。

最后线程调度(即操作系统决定哪个线程何时运行)是由操作系统控制的,而且通常是不确定的。

所以你想达到什么样的打印顺序,你就需要加入某些同步机制来完成而不是指望你代码一丢它就自己完成了.

细水静流

#9 Created at ... [Delete] [Delete and Lock User]

看下操作系统的进程与线程调度就可以了,其实就是一个线程执行一会,然后转到其余进程,直到再次执行这个线程的时候会接着上次未执行完的部分继续执行。

确实逗,,,不要心存侥幸心理。


  • 1

Reply