Questions tagged «multithreading»

多线程是计算机或程序通过利用多个并发的执行流(通常称为线程)来并发或异步执行工作的能力。

7
同时运行多个AsyncTasks-不可能吗?
我正在尝试同时运行两个AsyncTask。(平台是Android 1.5,HTC Hero。)但是,只有第一个被执行。这是描述我的问题的简单代码段: public class AndroidJunk extends Activity { class PrinterTask extends AsyncTask<String, Void, Void> { protected Void doInBackground(String ... x) { while (true) { System.out.println(x[0]); try { Thread.sleep(1000); } catch (InterruptedException ie) { ie.printStackTrace(); } } } }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); new PrinterTask().execute("bar bar …

10
为什么必须wait()始终处于同步块中
我们都知道,为了调用Object.wait(),必须将此调用放置在同步块中,否则将IllegalMonitorStateException引发。但是,进行此限制的原因是什么?我知道这wait()会释放监视器,但是为什么我们需要通过使特定块同步来显式获取监视器,然后通过调用来释放监视器wait()? 如果可以wait()在同步块之外调用并保留其语义-挂起调用者线程,可能造成什么损害?

17
如何使线程超时
我想在一个固定的时间内运行一个线程。如果未在该时间内完成,我想杀死它,抛出一些异常或以某种方式处理它。如何做呢? 我从该线程 了解到的一种方法是在该线程的run()方法内使用TimerTask。 有没有更好的解决方案呢? 编辑:添加赏金,因为我需要一个更明确的答案。下面给出的ExecutorService代码无法解决我的问题。为什么在执行完某些代码后就进入sleep()-我无法处理这段代码?如果代码已完成并且sleep()被中断,那怎么可能是超时呢? 需要执行的任务不在我的控制范围内。它可以是任何代码。问题是这段代码可能会陷入无限循环。我不希望那样发生。因此,我只想在单独的线程中运行该任务。父线程必须等到该线程完成并且需要知道任务的状态(即它是否超时还是发生某些异常,或者它是否成功)。如果任务进入无限循环,则我的父线程将无限期地等待,这不是理想的情况。

10
如何在Visual Studio中调试单个线程?
我有一些项目的解决方案。不同项目中有几个断点。我想跟踪第一个遇到这些断点的线程,并继续跟踪该单个线程,尽管其他线程进入了相同的代码块。 我知道可以通过在断点上定义一个条件来实现这一点,即线程名称= ...或线程ID = ...,但是我的情况是负载很重的ASP.NET应用程序,并且一旦附加到w3wp.exe许多线程将达到断点。我需要一些东西ThreadLocal<break-point>。 可能吗?如果是这样,怎么办?

3
RxJava调度程序的用例
在RxJava中,有5种不同的调度程序可供选择: Immediate():创建并返回一个Scheduler,该Scheduler立即在当前线程上执行工作。 trampoline():创建并返回一个调度程序,该调度程序在当前工作完成后将要在当前线程上执行的工作排队。 newThread():创建并返回一个Scheduler,该Scheduler为每个工作单元创建一个新的Thread。 Calculation():创建并返回用于计算工作的Scheduler。这可以用于事件循环,处理回调和其他计算工作。不要在此调度程序上执行IO绑定工作。使用计划程序。io()代替。 io():创建并返回用于IO绑定工作的Scheduler。该实现由Executor线程池支持,该线程池将根据需要增长。这可用于异步执行阻塞IO。不要在此调度程序上执行计算工作。使用计划程序。Calculation()代替。 问题: 前三个调度程序很容易说明。但是,我对计算和io有点困惑。 什么是“ IO绑定工作”?它用于处理流(java.io)和文件(java.nio.files)吗?它用于数据库查询吗?它是否用于下载文件或访问REST API? 如何计算()从不同newThread() ?是否所有的Calculation()调用都在单个(后台)线程上,而不是每次都在一个新的(后台)线程上? 为什么在进行IO工作时调用calculation()很糟糕? 为什么在执行计算工作时调用io()不好?

14
Linux中的线程与进程
我最近听到一些人说,在Linux中,使用进程而不是线程几乎总是更好的,因为Linux在处理进程方面非常有效,并且与线程相关的问题很多(例如锁定)。但是,我感到怀疑,因为在某些情况下,线程似乎可以带来很大的性能提升。 所以我的问题是,当线程和进程都可以很好地处理时,我应该使用进程还是线程?例如,如果我正在编写Web服务器,是否应该使用进程或线程(或组合)?

10
C#静态构造函数线程安全吗?
换句话说,此Singleton实现线程是否安全: public class Singleton { private static Singleton instance; private Singleton() { } static Singleton() { instance = new Singleton(); } public static Singleton Instance { get { return instance; } } }



11
如果async-await不创建任何其他线程,那么它如何使应用程序响应?
一次又一次,我看到它说使用async- await不会创建任何其他线程。这是没有道理的,因为一台计算机似乎一次只能完成一件事情的唯一方法是 实际上一次执行一件以上的事情(并行执行,使用多个处理器) 通过计划任务并在它们之间进行切换来模拟它(执行一点A,一点B,一点A等) 因此,如果async- await这些都不起作用,那么如何使应用程序响应呢?如果只有1个线程,则调用任何方法都意味着先等待该方法完成,然后再执行其他操作,并且该方法内的方法必须等待结果之后再进行操作,依此类推。

7
守护程序线程说明
在Python文档中 它说: 线程可以标记为“守护程序线程”。该标志的重要性在于,仅保留守护程序线程时,整个Python程序都会退出。初始值是从创建线程继承的。 没有人对这意味着什么有更清楚的解释,或者有实际的示例显示了将线程设置为的位置daemonic? 为我澄清一下:因此,您唯一不希望将线程设置为的情况daemonic是,您希望它们在主线程退出后继续运行吗?

15
C#事件和线程安全
更新 从C#6开始,此问题的答案是: SomeEvent?.Invoke(this, e); 我经常听到/阅读以下建议: 在检查null并触发事件之前,请务必复制事件。这将消除潜在的线程问题,即事件null在您检查空值和触发事件的位置之间的位置变为: // Copy the event delegate before checking/calling EventHandler copy = TheEvent; if (copy != null) copy(this, EventArgs.Empty); // Call any handlers on the copied list 更新:我从阅读有关优化的内容中认为,这可能还要求事件成员具有可变性,但是Jon Skeet在回答中指出CLR不会优化副本。 但是,与此同时,为了使此问题发生,另一个线程必须执行以下操作: // Better delist from event - don't want our handler called from now on: otherObject.TheEvent -= …

11
什么是“线程”(真的)?
我一直在努力寻找一个好的定义,并了解线程的真正含义。 看来我肯定缺少一些明显的东西,但是每次我读到什么是线程时,它几乎都是一个循环定义,例如“线程是执行线程”或“一种划分运行任务的方式”。嗯嗯 ?? 从我阅读的内容来看,线程似乎并不是真正的具体东西,就像进程一样。实际上,这只是一个概念。根据我对这种工作方式的了解,处理器为程序执行一些命令(被称为执行线程),然后当需要切换到其他程序的处理时,它会存储处理器的状态。当前正在某处执行的程序(线程本地存储),然后开始执行其他程序的指令。来回。这样,线程实际上只是当前正在运行的程序的“执行路径之一”的概念。 与流程不同的是,流程实际上是某物-它是资源的集合等。 作为一个定义的例子并没有太大帮助。。。 从维基百科: “计算机科学中的线程是执行线程的缩写。线程是程序将自身划分为两个(或多个)同时(或伪同时)运行的任务的方法。线程和进程不同于一个。操作系统,但通常情况下,一个进程中包含一个线程,并且同一进程中的不同线程共享相同的资源,而同一多任务操作系统中的不同进程则不共享。 那我说的对吗?错误?真正的线程是什么? 编辑:显然,一个线程也给出了自己的调用堆栈,所以这是有点的具体事情。

2
异步编程和多线程有什么区别?
我认为它们基本上是同一回事–编写在处理器之间(在具有2个以上处理器的机器上)将任务分割的程序。然后,我正在阅读this,它说: 异步方法旨在作为非阻塞操作。在等待任务运行时,异步方法中的等待表达式不会阻塞当前线程。取而代之的是,表达式将方法的其余部分作为继续进行签名,并将控制权返回给异步方法的调用者。 async和await关键字不会导致创建其他线程。异步方法不需要多线程,因为异步方法不会在自己的线程上运行。该方法在当前同步上下文上运行,并且仅在该方法处于活动状态时才在线程上使用时间。您可以使用Task.Run将受CPU约束的工作移至后台线程,但是后台线程对仅等待结果可用的进程没有帮助。 我想知道是否有人可以帮我翻译成英文。似乎在异步性(是一个词?)和线程之间进行了区分,这意味着您可以拥有一个具有异步任务但没有多线程的程序。 现在,我了解了异步任务的想法,例如pg上的示例。乔恩·斯基特(Jon Skeet)的《C#深度》第 467页,第三版 async void DisplayWebsiteLength ( object sender, EventArgs e ) { label.Text = "Fetching ..."; using ( HttpClient client = new HttpClient() ) { Task<string> task = client.GetStringAsync("http://csharpindepth.com"); string text = await task; label.Text = text.Length.ToString(); } } 该async关键字的意思是“ 这个功能,无论何时它被调用时,不会在这是需要的一切它的完成被称为它的呼叫后,上下文调用。” 换句话说,将其写在某些任务的中间 int x = …


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.