我有一个方法返回一个期货List List<Future<O>> futures = getFutures(); 现在我要等到所有的期货都成功完成处理,或者任何由未来返回输出的任务都抛出exception。 即使有一个任务抛出exception,也没有必要等待另一个未来。 简单的方法将是 wait() { For(Future f : futures) { try { f.get(); } catch(Exception e) { //TODO catch specific exception // this future threw exception , means somone could not do its task return; } } } 但是这里的问题是,如果第四个未来抛出exception,那么我将不必要地等待前三个期货可用。 如何解决这个问题? 将以任何方式倒计时闩锁帮助? 我无法使用Future isDone因为java文档说 boolean isDone() Returns true if this task […]
你如何确定线程是否正在运行?
我需要尝试locking一个对象,如果它已经locking只是继续(超时,或没有它)。 C#locking语句阻塞。
QThread的Qt文档说从QThread创build一个类,并实现run方法。 以下是取自4.7 Qthread文档… 要创build自己的线程,创build子类QThread并重新实现run()。 例如: class MyThread : public QThread { public: void run(); }; void MyThread::run() { QTcpSocket socket; // connect QTcpSocket's signals somewhere meaningful … socket.connectToHost(hostName, portNumber); exec(); } 所以在我创build的每一个线程中,我已经完成了这个工作,对于大多数事情来说它工作得很好(我没有在我的任何对象中实现moveToThread(this),而且效果很好)。 上周我遇到了一个麻烦(设法通过在我创build我的对象的地方工作来解决这个问题),并发现了以下博客post 。 这里基本上说,子类化QThread真的不是正确的方法来做到这一点(和文档是不正确的)。 这是来自Qt开发人员,所以乍一看我感兴趣,经过进一步思考,同意他的观点。 遵循面向对象的原则,你真的只想要inheritance一个类,以进一步增强这个类…不只是直接使用类的方法…这就是为什么你实例… 比方说,我想移动一个自定义的QObject类到一个线程…什么是“正确”的方式呢? 在那个博客文章中,他说:“他有一个例子,但如果有人可以进一步向我解释它,将不胜感激! 更新: 由于这个问题得到了如此多的关注,下面是4.8文档的复制和粘贴,以“适当”的方式来实现一个QThread。 class Worker : public QObject { Q_OBJECT QThread workerThread; public slots: void doWork(const QString […]
从GCC 4.8草案变更日志 : G ++现在实现了C ++ 11的 thread_local关键字; 这与GNU __thread关键字的区别主要在于它允许dynamic初始化和销毁语义。 不幸的是,即使不需要dynamic初始化,对于非函数本地thread_localvariables的引用,这种支持也需要运行时间的惩罚,因此用户可能希望继续使用具有静态初始化语义的TLSvariables的__thread 。 这个运行时间惩罚的性质和起源究竟是什么? 显然,为了支持非函数本地的thread_localvariables,需要在进入每个线程main之前进行一个线程初始化阶段(就像全局variables有一个静态的初始化阶段一样),但是它们是否指向一些运行时间惩罚那? 粗略地说,gcc的thread_local的新实现的体系结构是什么?
我正确地认为这是一个并行字典的正确使用 private ConcurrentDictionary<int,long> myDic = new ConcurrentDictionary<int,long>(); //Main thread at program startup for(int i = 0; i < 4; i++) { myDic.Add(i, 0); } //Seperate threads use this to update a value myDic[InputID] = newLongValue; 我没有锁等,只是更新字典中的值,即使多个线程可能会尝试做同样的事情。
在阅读关于Java线程的文章时,我经常注意到:“当前线程是这个对象监视器的所有者”。 我明白了这个意思:线程有权对对象进行操作。 但是我为什么用“对象的监视器”而不是“对象的locking”这个短语呢? 简而言之,我不知道“监视器”这个词的意思。这个问题可能很奇怪,很简单。 但我希望有人能帮助解决它。 3KS
我有一个单线程生产者创build一些任务对象,然后将其添加到一个ArrayBlockingQueue (这是固定的大小)。 我也开始一个multithreading的消费者。 这是build立一个固定的线程池( Executors.newFixedThreadPool(threadCount); )。 然后,我将一些ConsumerWorker实例提交给此ThreadPool,每个ConsumerWorker都具有对上述ArrayBlockingQueue实例的引用。 每个这样的工作人员将在队列中做一个take()处理任务。 我的问题是,有什么最好的方式让工人知道什么时候不会有任何工作要做。 换句话说,我怎么告诉工人,生产者已经join队列,从这一刻起,每个工人应该停下来,看看队列是空的。 我现在得到的是一个安装程序,我的Producer用一个callback来初始化,当他完成它的工作(添加队列的东西)时触发callback。 我还保留了我创build并提交给ThreadPool的所有ConsumerWorkers的列表。 当生产者callback告诉我生产者完成时,我可以告诉每个工人。 在这一点上,他们应该简单地继续检查队列是否为空,当它变为空时,它们应该停止,从而允许我正常closures下ExecutorService线程池。 这是这样的 public class ConsumerWorker implements Runnable{ private BlockingQueue<Produced> inputQueue; private volatile boolean isRunning = true; public ConsumerWorker(BlockingQueue<Produced> inputQueue) { this.inputQueue = inputQueue; } @Override public void run() { //worker loop keeps taking en element from the queue as long as the […]
所以我有一个程序,产生线程(〜5-150),执行一堆任务。 最初我使用了一个FixedThreadPool因为这个类似的问题表明它们更适合更长寿命的任务,而且由于我对multithreading的知识非常有限,所以我认为线程的平均寿命(几分钟)“ 长寿 ”。 不过,我最近添加了产生额外线程的function,这样做使我超出了我设置的线程限制。 在这种情况下,是否会更好地猜测和增加我可以允许的线程数或切换到CachedThreadPool所以我没有浪费线程? 初步尝试它们,似乎没有什么区别,所以我倾向于使用CachedThreadPool来避免浪费。 然而,线程的寿命是否意味着我应该select一个FixedThreadPool并只处理未使用的线程? 这个问题看起来好像那些额外的线程没有被浪费,但是我希望澄清。
我有这个代码: void Main() { System.Timers.Timer t = new System.Timers.Timer (1000); t.Enabled=true; t.Elapsed+= (sender, args) =>c(); Console.ReadLine(); } int h=0; public void c() { h++; new Thread(() => doWork(h)).Start(); } public void doWork(int h) { Thread.Sleep(3000); h.Dump(); } 我想知道如果间隔为1000毫秒,作业进程为3000毫秒,会发生什么情况。 不过,我看到一个奇怪的行为 – 3000毫秒的延迟只发生在一开始 ! 我怎样才能使每个工作睡眠3000毫秒? 正如你在这里看到的,一开始有3秒的延迟,然后每次迭代1秒。