Questions tagged «multithreading»

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

8
Android:什么时候应该使用Handler()?什么时候应该使用线程?
当我需要异步运行的东西(例如长时间运行的任务或使用网络的逻辑),或出于任何原因,启动新线程并运行它可以正常工作。创建一个处理程序并运行它也可以正常工作。有什么不同?我什么时候应该使用每个?使用a Handler和不使用a的优点/原因是Thread什么? PS。-为了这个问题,让我们忽略AsyncTask。- Handler().postDelayed用例对我来说很清楚,为这个问题,让我们假设我需要立即启动任务。

12
如何在没有IllegalMonitorStateException的情况下在Java中使用等待和通知?
我有2个矩阵,我需要将它们相乘,然后打印每个单元格的结果。准备好一个单元格后,我就需要打印它,但是例如,即使[2] [0]的结果先准备好,我也需要在单元格[2] [0]之前打印[0] [0]单元格。所以我需要按顺序打印它。所以我的想法是让打印机线程等待,直到multiplyThread通知它准备打印正确的单元格,然后printerThread它将打印该单元格并返回等待状态,依此类推。 所以我有这个线程做乘法: public void run() { int countNumOfActions = 0; // How many multiplications have we done int maxActions = randomize(); // Maximum number of actions allowed for (int i = 0; i < size; i++) { result[rowNum][colNum] = result[rowNum][colNum] + row[i] * col[i]; countNumOfActions++; // Reached …



13
如何使Java线程等待另一个线程的输出?
我正在用一个应用程序逻辑线程和一个数据库访问线程来制作Java应用程序。他们都坚持为应用程序和都需要的整个生命周期,以在同一时间运行(一个会谈到服务器,一个谈判给用户;当应用程序完全启动,我需要两个人工作)。 但是,在启动时,我需要确保最初应用线程等待直到数据库线程准备就绪(当前是通过轮询自定义方法确定的dbthread.isReady())。我不介意应用线程在数据库线程准备就绪之前是否阻塞。 Thread.join() 看起来不是一个解决方案-db线程仅在应用关闭时退出。 while (!dbthread.isReady()) {} 可以工作,但是空循环会消耗很多处理器周期。 还有其他想法吗?谢谢。


8
为什么Thread.Sleep如此有害
我经常看到它提到Thread.Sleep();不应使用,但我不明白为什么会这样。如果Thread.Sleep();会引起麻烦,是否有其他相同结果的替代解决方案是安全的? 例如。 while(true) { doSomework(); i++; Thread.Sleep(5000); } 另一个是: while (true) { string[] images = Directory.GetFiles(@"C:\Dir", "*.png"); foreach (string image in images) { this.Invoke(() => this.Enabled = true); pictureBox1.Image = new Bitmap(image); Thread.Sleep(1000); } }
128 c#  multithreading  sleep 

15
什么时候在C#中使用线程池?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 2年前关闭。 改善这个问题 我一直在尝试学习C#中的多线程编程,对于何时使用线程池而不是创建自己的线程,我感到困惑。一本书建议仅将线程池用于小型任务(无论这意味着什么),但我似乎找不到任何真正的准则。在做出此编程决策时,需要考虑哪些因素?


13
不可能使缓存的线程池具有大小限制吗?
限制缓存线程池的创建数量似乎是不可能的。 这是在标准Java库中实现static Executors.newCachedThreadPool的方式: public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } 因此,使用该模板继续创建固定大小的缓存线程池: new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new SynchronusQueue<Runable>()); 现在,如果您使用它并提交3个任务,一切都会好起来的。提交任何其他任务将导致拒绝执行异常。 试试这个: new ThreadPoolExecutor(0, 3, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runable>()); 将导致所有线程按顺序执行。即,线程池将永远不会产生多个线程来处理您的任务。 这是ThreadPoolExecutor的execute方法中的错误吗?还是这是故意的?还是有其他方法? 编辑:我想要的东西完全类似于缓存的线程池(它会按需创建线程,然后在超时后将其杀死),但是它可以创建的线程数受到限制,并且一旦有线程就可以继续排队其他任务达到其线程限制。根据sjlee的答复,这是不可能的。查看ThreadPoolExecutor的execute()方法确实是不可能的。我将需要像SwingWorker一样子类化ThreadPoolExecutor并重写exe​​cute(),但是SwingWorker在execute()中所做的事情是一个完整的技巧。

7
为什么reactjs中的setState是Async而不是Sync?
我刚刚发现,在React this.setState()函数中,任何组件中的函数都是异步的,或者在完成其调用的函数后被调用。 现在我搜索并找到了这个博客(setState()状态更改操作在ReactJS中可能是同步的) 在这里,他发现setState是async(在堆栈为空时调用)或sync(在调用后立即调用),具体取决于触发状态更改的方式。 现在这两件事很难消化 在博客中,该setState函数在一个函数内部被调用updateState,但是触发该updateState函数的并不是被调用函数知道的东西。 他们为什么要使setState异步,因为JS是单线程语言,而此setState不是WebAPI或服务器调用,因此只能在JS的线程上完成。他们这样做是为了使Re-Rendering不会停止所有事件侦听器和其他操作,或者存在其他设计问题。


3
串行队列上的dispatch_async和dispatch_sync之间的区别?
我创建了一个这样的串行队列: dispatch_queue_t _serialQueue = dispatch_queue_create("com.example.name", DISPATCH_QUEUE_SERIAL); 什么之间的差异dispatch_async被称为像这样 dispatch_async(_serialQueue, ^{ /* TASK 1 */ }); dispatch_async(_serialQueue, ^{ /* TASK 2 */ }); 并dispatch_sync在这个串行队列中这样调用? dispatch_sync(_serialQueue, ^{ /* TASK 1 */ }); dispatch_sync(_serialQueue, ^{ /* TASK 2 */ }); 我的理解是,无论使用哪种调度方法,TASK 1都将在执行之前完成并TASK 2正确吗?


18
如何等待BackgroundWorker取消?
考虑一个 为您做事的对象假设方法: public class DoesStuff { BackgroundWorker _worker = new BackgroundWorker(); ... public void CancelDoingStuff() { _worker.CancelAsync(); //todo: Figure out a way to wait for BackgroundWorker to be cancelled. } } 一个人如何等待BackgroundWorker完成? 过去人们尝试过: while (_worker.IsBusy) { Sleep(100); } 但这僵局IsBusy是因为直到RunWorkerCompleted事件处理后才清除,并且该事件只有在应用程序进入空闲状态后才能得到处理。直到工作人员完成后,应用程序才会处于空闲状态。(此外,这是一个繁忙的循环-令人作呕。) 其他人则建议将其合并为: while (_worker.IsBusy) { Application.DoEvents(); } 这样做的问题是Application.DoEvents()导致当前队列中的消息被处理,从而导致重新输入问题(.NET不能重新输入)。 我希望使用一些涉及事件同步对象的解决方案,其中代码等待事件-工作者的RunWorkerCompleted事件处理程序设置的事件。就像是: Event _workerDoneEvent = …

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.