Questions tagged «multithreading»

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

3
如何知道红宝石不是线程安全的?
从Rails 4开始,默认情况下所有内容都必须在线程环境中运行。这意味着所有我们写的代码和 所有我们使用需要是宝石threadsafe 因此,我对此没有几个问题: 在ruby / rails中,什么不是线程安全的?VS什么是Ruby / Rails中的线程安全? 是否有宝石的列表被称为是线程安全的,反之亦然? 是否有不是线程安全示例的常见代码模式列表@result ||= some_method? ruby lang核心中的数据结构(例如Hashetc线程)是否安全? 在MRI上,一个GVL/GIL表示一次只能运行1条红宝石线程,除了IO,线程安全更改对我们有影响吗?

9
ExecutorService在超时后中断任务
我正在寻找可以提供超时的ExecutorService实现。如果提交给ExecutorService的任务花费的时间超过了超时时间,则这些任务将被中断。实现这样的野兽并不是一个困难的任务,但是我想知道是否有人知道现有的实现。 这是我根据以下一些讨论得出的。任何意见? import java.util.List; import java.util.concurrent.*; public class TimeoutThreadPoolExecutor extends ThreadPoolExecutor { private final long timeout; private final TimeUnit timeoutUnit; private final ScheduledExecutorService timeoutExecutor = Executors.newSingleThreadScheduledExecutor(); private final ConcurrentMap<Runnable, ScheduledFuture> runningTasks = new ConcurrentHashMap<Runnable, ScheduledFuture>(); public TimeoutThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, long timeout, TimeUnit timeoutUnit) …

8
从线程返回值
我有一个方法HandlerThread。值在内部被更改Thread,我想将其返回给该test()方法。有没有办法做到这一点? public void test() { Thread uiThread = new HandlerThread("UIHandler"){ public synchronized void run(){ int value; value = 2; //To be returned to test() } }; uiThread.start(); }

28
简单的死锁示例
我想向新手解释线程死锁。过去,我看到过很多死锁的示例,有些使用代码,有些使用插图(例如著名的4辆汽车)。还有诸如The Dining Philosophers之类的容易陷入僵局的经典问题,但是对于真正的新手来说,这些问题可能太复杂而无法完全掌握。 我正在寻找最简单的代码示例来说明什么是死锁。该示例应: 与有意义的“真实”编程场景有关 简短,简单明了 您有什么推荐的吗?

6
CountDownLatch与信号量
使用有什么好处吗 java.util.concurrent.CountdownLatch 代替 java.util.concurrent.Semaphore吗? 据我所知,以下片段几乎是等效的: 1.信号量 final Semaphore sem = new Semaphore(0); for (int i = 0; i < num_threads; ++ i) { Thread t = new Thread() { public void run() { try { doStuff(); } finally { sem.release(); } } }; t.start(); } sem.acquire(num_threads); 2:CountDownLatch final CountDownLatch latch …

3
实施永无止境的任务的正确方法。(计时器与任务)
因此,只要应用程序正在运行或要求取消,我的应用程序就需要几乎连续地执行操作(每次运行之间有10秒左右的暂停)。它需要做的工作可能要花费30秒。 最好使用System.Timers.Timer并使用AutoReset确保在上一个“刻度”完成之前它不执行操作。 还是我应该在LongRunning模式下使用带有取消令牌的常规Task,并在其中执行常规的无限while循环,以调用之间用10秒的Thread.Sleep进行操作来执行操作?至于异步/等待模型,我不确定这里是否合适,因为我没有任何返回值。 CancellationTokenSource wtoken; Task task; void StopWork() { wtoken.Cancel(); try { task.Wait(); } catch(AggregateException) { } } void StartWork() { wtoken = new CancellationTokenSource(); task = Task.Factory.StartNew(() => { while (true) { wtoken.Token.ThrowIfCancellationRequested(); DoWork(); Thread.Sleep(10000); } }, wtoken, TaskCreationOptions.LongRunning); } void DoWork() { // Some work that takes …




16
等到所有线程在Java中完成工作
我正在编写一个具有5个线程的应用程序,这些线程可以同时从Web获取一些信息,并在缓冲区类中填充5个不同的字段。 当所有线程完成其工作时,我需要验证缓冲区数据并将其存储在数据库中。 我该怎么做(当所有线程完成工作时收到警报)?

8
非最终字段的同步
每次我在非最终类别字段上进行同步时,都会显示警告。这是代码: public class X { private Object o; public void setO(Object o) { this.o = o; } public void x() { synchronized (o) // synchronization on a non-final field { } } } 所以我通过以下方式更改了编码: public class X { private final Object o; public X() { o = new Object(); } …

7
MemoryCache线程安全,是否需要锁定?
首先,让我把它扔在那里,我知道下面的代码不是线程安全的(更正:可能)。我正在努力寻找的是一种实现,而我实际上可能在测试中失败。我现在正在重构一个大型WCF项目,该项目需要一些(主要是)静态数据进行缓存,并从SQL数据库中进行填充。它需要至少每天过期一次并“刷新”一次,这就是为什么我要使用MemoryCache。 我知道下面的代码不应该是线程安全的,但是我不能让它在重负载下失败,而且使Google搜索显示两种实现方式的问题复杂化(带锁和不带锁以及是否有必要进行辩论的结合)。 能够在多线程环境中拥有MemoryCache知识的人可以让我确切地知道是否需要在适当的地方锁定,以便在检索/重新填充期间不会引发对remove的调用(很少调用,但这是必需的)。 public class MemoryCacheService : IMemoryCacheService { private const string PunctuationMapCacheKey = "punctuationMaps"; private static readonly ObjectCache Cache; private readonly IAdoNet _adoNet; static MemoryCacheService() { Cache = MemoryCache.Default; } public MemoryCacheService(IAdoNet adoNet) { _adoNet = adoNet; } public void ClearPunctuationMaps() { Cache.Remove(PunctuationMapCacheKey); } public IEnumerable GetPunctuationMaps() { if …

7
信号量-初始计数有什么用?
http://msdn.microsoft.com/zh-CN/library/system.threading.semaphoreslim.aspx 要创建信号灯,我需要提供一个初始计数和最大计数。MSDN指出,初始计数为- 可以同时授予的信号量请求的初始数量。 虽然它指出最大数量是 可以同时授予的信号量请求的最大数量。 我可以理解,最大数量是可以同时访问资源的最大线程数。但是,初始计数的用途是什么? 如果我创建的信号量的初始计数为0,最大计数为2,则我的线程池线程都无法访问该资源。如果将初始计数设置为1,最大计数设置为2,则只有线程池线程可以访问资源。仅当我将初始计数和最大计数都设置为2时,两个线程才能够同时访问资源。那么,我真的对初始计数的重要性感到困惑吗? SemaphoreSlim semaphoreSlim = new SemaphoreSlim(0, 2); //all threadpool threads wait SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 2);//only one thread has access to the resource at a time SemaphoreSlim semaphoreSlim = new SemaphoreSlim(2, 2);//two threadpool threads can access the resource concurrently

9
Android SDK AsyncTask doInBackground未运行(子类)
截至2012年2月15日,我还没有找到一个很好的解释,也没有找到不起作用的原因。最接近解决方案的是使用传统的Thread方法,但是为什么要包含一个(似乎)在Android SDK中不起作用的类? 就这样! 我有一个AsyncTask子类: // ParseListener had a callback which was called when an item was parsed in a // RSS-xml, but as stated further down it is not used at all right now. private class xmlAsync extends AsyncTask<String, RSSItem, Void> implements ParseListener 这样执行: xmlAsync xmlThread = new xmlAsync(); xmlThread.execute("http://www.nothing.com"); …


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.