Questions tagged «multithreading»

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

4
如何创建Looper线程,然后立即向其发送消息?
我有一个工作线程位于后台,用于处理消息。像这样: class Worker extends Thread { public volatile Handler handler; // actually private, of course public void run() { Looper.prepare(); mHandler = new Handler() { // the Handler hooks up to the current Thread public boolean handleMessage(Message msg) { // ... } }; Looper.loop(); } } 从主线程(UI线程,没关系),我想做这样的事情: Worker worker = …

9
由于GIL,在多线程Python代码中是否不需要锁?
如果您依赖具有全局解释器锁(即CPython)的Python实现并编写多线程代码,那么您真的需要锁吗? 如果GIL不允许并行执行多个指令,那么共享数据是否有必要保护吗? 抱歉,这是一个愚蠢的问题,但这是我一直想知道的关于多处理器/核心计算机上的Python的东西。 同样的情况也适用于具有GIL的任何其他语言实现。

8
将ExecutorService转换为Java中的守护程序
我正在Java 1.6中使用ExecutoreService,其启动方式仅由 ExecutorService pool = Executors.newFixedThreadPool(THREADS). 当我的主线程完成时(以及线程池处理的所有任务),该池将阻止我的程序关闭,直到我显式调用 pool.shutdown(); 是否可以通过某种方式将此池使用的内部线程管理转换为守护线程来避免调用此方法?还是我在这里想念什么。

3
使用multiprocessing.Process并发进程数最多
我有Python代码: from multiprocessing import Process def f(name): print 'hello', name if __name__ == '__main__': for i in range(0, MAX_PROCESSES): p = Process(target=f, args=(i,)) p.start() 运行良好。但是,MAX_PROCESSES是变量,可以是1和之间的任何值512。由于我仅在具有8内核的计算机上运行此代码,因此我需要确定是否有可能限制允许同时运行的进程数。我已经调查过了multiprocessing.Queue,但看起来不像我需要的东西-也许我在错误地解释了文档。 有没有一种方法可以限制同时multiprocessing.Process运行的数量?

6
Java中是否有一个“直到条件变为真”的功能?
我正在为服务器编写侦听器线程,此刻我正在使用: while (true){ try { if (condition){ //do something condition=false; } sleep(1000); } catch (InterruptedException ex){ Logger.getLogger(server.class.getName()).log(Level.SEVERE, null, ex); } } 使用上面的代码,我遇到了运行功能吃掉所有cpu时间循环的问题。睡眠功能有效,但似乎是临时解决方案,而不是解决方案。 是否有一些函数会阻塞直到变量“ condition”变为“ true”?还是连续循环等待变量值改变的标准方法?


5
Python中的线程本地存储
如何在Python中使用线程本地存储? 有关 Python中的“线程本地存储”是什么,为什么需要它?-共享变量时,该线程似乎更加关注。 确定特定功能是否在Python堆栈中的有效方法-Alex Martelli提供了一个不错的解决方案

4
是否可以保证Task.Factory.StartNew()使用调用线程以外的其他线程?
我正在从一个函数启动一个新任务,但我不希望它在同一线程上运行。我不在乎它在哪个线程上运行,只要它在另一个线程上即可(因此在此问题中无济于事)。 我是否保证下面的代码TestLock在Task t再次允许输入之前总是退出?如果不是,为防止重入,推荐的设计模式是什么? object TestLock = new object(); public void Test(bool stop = false) { Task t; lock (this.TestLock) { if (stop) return; t = Task.Factory.StartNew(() => { this.Test(stop: true); }); } t.Wait(); } 编辑:根据乔恩·斯凯特(Jon Skeet)和史蒂芬·图布(Stephen Toub)的以下回答,一种确定性地防止重入的简单方法是传递CancellationToken,如以下扩展方法所示: public static Task StartNewOnDifferentThread(this TaskFactory taskFactory, Action action) { return taskFactory.StartNew(action: action, cancellationToken: …

2
SpinWait与睡眠等待。使用哪一个?
它有效吗 SpinWait.SpinUntil(() => myPredicate(), 10000) 超时10000ms 要么 Thread.Sleep在相同条件下使用轮询是否更有效?例如,遵循以下SleepWait功能: public bool SleepWait(int timeOut) { Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); while (!myPredicate() && stopwatch.ElapsedMilliseconds < timeOut) { Thread.Sleep(50) } return myPredicate() } 我担心如果谈论的是超过1秒的超时,那么SpinWait的所有收益可能都不是一个好的用法模式?这是一个有效的假设吗? 您喜欢哪种方法,为什么?还有另一种更好的方法吗? 更新-变得更加具体: 有没有办法让BlockingCollection Pulse在达到限制容量时成为休眠线程?我宁可避免像马克·格雷夫(Marc Gravel)所说的那样忙碌地等待。

3
如何创建运行STA线程的任务(TPL)?
使用线程非常简单 Thread thread = new Thread(MethodWhichRequiresSTA); thread.SetApartmentState(ApartmentState.STA); 如何在WPF应用程序中使用“任务”完成相同任务?这是一些代码: Task.Factory.StartNew ( () => {return "some Text";} ) .ContinueWith(r => AddControlsToGrid(r.Result)); 我收到一个InvalidOperationException与 调用线程必须是STA,因为许多UI组件都需要STA。

12
Java中volatile关键字的最简单易懂的示例
我正在阅读有关Java中的volatile关键字的信息,并完全理解了它的理论部分。 但是,我要寻找的是一个很好的案例,它显示了如果变量不是volatile的话会发生什么。 以下代码段未按预期运行(从此处获取): class Test extends Thread { boolean keepRunning = true; public void run() { while (keepRunning) { } System.out.println("Thread terminated."); } public static void main(String[] args) throws InterruptedException { Test t = new Test(); t.start(); Thread.sleep(1000); t.keepRunning = false; System.out.println("keepRunning set to false."); } } 理想情况下,如果keepRunning不是volatile,则线程应无限期继续运行。但是,它确实会在几秒钟后停止。 我有两个基本问题: 谁能用例子解释易失性?不符合JLS的理论。 …

4
从非异步代码调用异步方法
我正在更新具有.NET 3.5中内置的API表面的库。结果,所有方法都是同步的。我无法更改API(即,将返回值转换为Task),因为这将要求所有调用者都进行更改。因此,我剩下如何以同步方式最好地调用异步方法了。这是在ASP.NET 4,ASP.NET Core和.NET / .NET Core控制台应用程序的上下文中。 我可能还不够清楚-这种情况是我有不支持异步的现有代码,并且我想使用仅支持异步方法的新库,例如System.Net.Http和AWS开发工具包。因此,我需要弥合差距,并能够拥有可以被同步调用但可以在其他地方调用异步方法的代码。 我已经读了很多书,而且有很多次被问及回答了。 从非异步方法调用异步方法 同步等待异步操作,为什么Wait()在这里冻结程序 从同步方法中调用异步方法 如何同步运行异步Task <T>方法? 同步调用异步方法 如何在C#中从同步方法调用异步方法? 问题是大多数答案都不一样!我见过的最常见的方法是使用.Result,但这会导致死锁。我已经尝试了以下所有方法,并且它们都能正常工作,但是我不确定哪种方法可以避免死锁,具有良好的性能并且可以在运行时很好地发挥作用(在尊重任务调度程序,任务创建选项等方面) )。有明确的答案吗?最好的方法是什么? private static T taskSyncRunner<T>(Func<Task<T>> task) { T result; // approach 1 result = Task.Run(async () => await task()).ConfigureAwait(false).GetAwaiter().GetResult(); // approach 2 result = Task.Run(task).ConfigureAwait(false).GetAwaiter().GetResult(); // approach 3 result = task().ConfigureAwait(false).GetAwaiter().GetResult(); // approach …

10
为什么同步块比同步方法更好?
我已经开始学习线程同步。 同步方法: public class Counter { private static int count = 0; public static synchronized int getCount() { return count; } public synchronized setCount(int count) { this.count = count; } } 同步块: public class Singleton { private static volatile Singleton _instance; public static Singleton getInstance() { if (_instance == null) …



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.