Questions tagged «multithreading»

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


13
如何等待多个线程完成?
有什么方法可以简单地等待所有线程进程完成?例如,假设我有: public class DoSomethingInAThread implements Runnable{ public static void main(String[] args) { for (int n=0; n<1000; n++) { Thread t = new Thread(new DoSomethingInAThread()); t.start(); } // wait for all threads' run() methods to complete before continuing } public void run() { // do something here } } 如何更改此main()方法,以便该方法在注释处暂停,直到所有线程的run()方法退出?谢谢!




4
引用分配是原子的,那么为什么需要Interlocked.Exchange(ref Object,Object)?
在我的多线程asmx Web服务中,我有一个自己类型为SystemData的类字段_allData,由几个组成List<T>并Dictionary<T>标记为volatile。系统数据(_allData)会不时刷新,我通过创建另一个称为的对象newData并用新数据填充其数据结构来做到这一点。完成后,我只分配 private static volatile SystemData _allData public static bool LoadAllSystemData() { SystemData newData = new SystemData(); /* fill newData with up-to-date data*/ ... _allData = newData. } 这应该起作用,因为分配是原子的,并且引用了旧数据的线程继续使用它,其余线程在分配后立即拥有了新的系统数据。但是我的同事说,volatile我不应该使用关键字和简单配置,InterLocked.Exchange因为他说在某些平台上不能保证引用分配是原子的。另外:当我宣布the _allData字段volatile的 Interlocked.Exchange<SystemData>(ref _allData, newData); 产生警告“对volatile字段的引用将不会被视为volatile”我应该怎么看?

6
如何根据CPU内核扩展线程?
我想用Java中的多个线程解决数学问题。我的数学问题可以分为多个工作单元,我想通过几个线程来解决。 我不希望有固定数量的线程在工作,而是与CPU核心数量匹配的线程数量。我的问题是,为此我在互联网上找不到简单的教程。我发现的都是带有固定线程的示例。 如何才能做到这一点?你能提供例子吗?

9
yield()的主要用途是什么,它与join()和interrupt()有何区别?
我yield()对Java 中方法的使用有些困惑,尤其是在下面的示例代码中。我也读过yield()是“用来防止线程执行的”。 我的问题是: 我相信下面的代码在使用yield()和不使用时都会产生相同的输出。这样对吗? 实际上,的主要用途是yield()什么? 在哪些方面yield()从不同join()和interrupt()方法? 代码示例: public class MyRunnable implements Runnable { public static void main(String[] args) { Thread t = new Thread(new MyRunnable()); t.start(); for(int i=0; i<5; i++) { System.out.println("Inside main"); } } public void run() { for(int i=0; i<5; i++) { System.out.println("Inside run"); Thread.yield(); } } } …

9
如何在线程之间传播异常?
我们有一个单线程调用的函数(我们将其命名为主线程)。在函数主体内,我们产生多个工作线程来执行CPU密集型工作,等待所有线程完成,然后在主线程上返回结果。 结果是调用者可以天真地使用该函数,并且在内部它将使用多个内核。 到目前为止一切都很好。 我们遇到的问题是处理异常。我们不希望工作线程上的异常会使应用程序崩溃。我们希望函数的调用者能够在主线程上捕获它们。我们必须捕获工作线程上的异常,并将其传播到主线程,以使它们继续从那里展开。 我们应该怎么做? 我能想到的最好的是: 在我们的工作线程上捕获各种各样的异常(std :: exception和我们自己的一些异常)。 记录异常的类型和消息。 在主线程上有一个对应的switch语句,该语句会引发工作线程上记录的任何类型的异常。 这具有明显的缺点,即仅支持有限的一组异常类型,并且每当添加新的异常类型时都需要进行修改。



7
JavaScript需要互斥吗?
我看过这个链接:在JavaScript中实现互斥。另一方面,我已经读到javascript中没有线程,但这到底是什么意思? 当事件发生时,它们可以在代码中的何处中断? 并且,如果JS中没有线程,是否需要在JS中使用互斥锁? 具体来说,我想知道如何使用功能由所谓的影响setTimeout()和XmlHttpRequest的onreadystatechange对全局访问的变量。

4
如何使用strace跟踪子进程?
我曾经strace短暂地附加一个过程。该过程创建了90个线程。当我找到有问题的线程时,我必须繁琐地搜索父线程,然后是祖父母线程,一直到根进程。 是否有技巧或工具可以快速找出哪个线程创建了另一个线程?还是更好,打印类似树的线程创建树pstree?

5
Java Regex线程安全吗?
我有一个函数,该函数使用Pattern#compile和Matcher来在字符串列表中搜索模式。 此函数用于多个线程。每个线程将在Pattern#compile创建线程时传递给的唯一模式。线程和模式的数量是动态的,这意味着我可以Pattern在配置期间添加更多s和线程。 synchronize如果使用正则表达式,是否需要在此函数上放一个?Java线程中的正则表达式安全吗?

8
如何保持.NET控制台应用程序运行?
考虑一个控制台应用程序,该应用程序在单独的线程中启动某些服务。它所要做的就是等待用户按下Ctrl + C将其关闭。 以下哪一项是更好的方法? static ManualResetEvent _quitEvent = new ManualResetEvent(false); static void Main() { Console.CancelKeyPress += (sender, eArgs) => { _quitEvent.Set(); eArgs.Cancel = true; }; // kick off asynchronous stuff _quitEvent.WaitOne(); // cleanup/shutdown and quit } 或者使用Thread.Sleep(1): static bool _quitFlag = false; static void Main() { Console.CancelKeyPress += delegate { …

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.