我正在http://www.python-course.eu/threads.php的帮助下学习python线程处理。这段代码的解释让我很困惑:
from thread import start_new_thread
num_threads = 0
def heron(a):
global num_threads
num_threads += 1
# code has been left out, see above(some operations)
num_threads -= 1
return new
start_new_thread(heron,(99,))
start_new_thread(heron,(999,))
start_new_thread(heron,(1733,))
start_new_thread(heron,(17334,))
while num_threads > 0:
pass
代码:
num_threads += 1
读取num_thread的值
一个新的int实例将增加或减少1(我认为一个新的int对象将被创建)
将新值分配给num_threads
像这样的错误发生在增量赋值的情况下:
第一个线程读取变量num_threads,它的值仍然是0。令人困惑的是:读取这个值后,操作系统让线程进入睡眠状态。现在轮到第二个线程了:它还读取变量num_threads的值,它仍然是0,因为第一个线程太早进入睡眠状态,也就是说,在它能够将其值增加1之前。现在第二个线程进入睡眠状态。现在轮到第三个线程了,它再次读取0,但是计数器现在应该是2。这些线程中的每一个现在都将值1分配给计数器。减量操作也会出现类似的问题。
这里的线索是线程在概念上是并发的(它们彼此并行运行),但实际上是顺序的。你的中央处理器的每个核心一次只能做一个操作,所以为了给你一个你的计算机是多任务处理的印象,中央处理器以非常高的速度切换它正在做的事情。通常是你的操作系统为你处理这个问题。
由于num_threads=1实际上是两个语句,即
temp_num=num_threads1
和num_threads=temp_num
,因此CPU正在执行的线程可能会在这两个操作之间切换。
这说明了在几个线程之间访问共享数据的一些危险。
如果你想了解更多关于在线程中应该做什么和不应该做什么的信息,你应该寻找的关键字是
线程安全
。
< sub >应该注意的是,如果线程真的是并发的,这种情况不会有太大的改善,因为您仍然可能在错误的时间从共享内存中读取数据(或者甚至在它被写入的时候)。
问题内容: 当用户选择在另一个线程中启动阻止进程的菜单项时,我试图在JavaFX 8应用程序中提供反馈。在我的实际应用程序中,它是文件下载,但是通过示例,我使用最少的代码创建了一个测试用例: 它的工作方式如下:当选择“开始”菜单项时,主菜单文本应立即更改为“正在运行…”,然后应附加“完成!”。经过5秒钟的模拟我的文件下载的睡眠。 实际上发生的是,即使我正在使用,在阻止过程完成 后 , 两个 文本更
我正在eclipse上处理一个程序,遇到一个错误,上面写着:线程“main”java.lang.error:Unresolved compilation problem:at main.main(main.java:19)我是编程新手,如果您告诉我这个错误是什么,以及我如何修复它,这将非常重要。谢谢你!
此问题的完整代码可在此处获得:https://github.com/NACHC-CAD/thread-tool 下面显示的代码似乎一直运行到完成,但从未逃脱此处显示的while循环。 如果我取消注释
问题内容: 线程启动后,如果该线程的引用设置为,那么该线程将如何处理?会停止吗?它有资格获得GC吗? 像这样: 问题答案: 实时线程将继续运行,即使其引用设置为null。 就像任何其他对象一样,当没有任何引用时,它就有资格使用GC。棘手的一点是,即使您的程序未保留一个 正在运行的线程 在ThreadGroup中的引用,因此 也永远不会 对 正在运行的线程进行GC。
问题内容: 我知道从线程调用是一个坏主意。但是,如果线程使用创建新进程,将会发生什么? 新进程将是创建线程的主线程的子进程。我认为。 如果其父级先完成,则新进程将附加到init进程中。它的父级是主线程,而不是创建它的线程。 如果我错了,请纠正我。 问题答案: 新进程将是创建线程的主线程的子进程。我认为。 创建一个新的过程。一个进程的父进程是另一个进程,而不是线程。因此,新流程的父级是旧流程。 请注
在下面的代码中,为什么主线程要等到子线程完成。 Driver.java ThreadRunner.java 调用“t.start()”后,在驱动程序类中,程序是否应该退出?我没有使用join,但主线程仍在等待,直到新旋转的“ThreadRunner”运行开始。这是因为在java中,主线程(由main方法启动)总是等待所有线程关闭吗?