Questions tagged «multithreading»

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

9
同步访问SimpleDateFormat
SimpleDateFormat的Javadoc指出SimpleDateFormat没有同步。 “日期格式不同步。建议为每个线程创建单独的格式实例。如果多个线程同时访问一种格式,则必须在外部进行同步。” 但是,在多线程环境中使用SimpleDateFormat实例的最佳方法是什么。这是我想到的一些选项,我过去曾使用过选项1和2,但是我很想知道是否有更好的选择,或者这些选项中的哪一个可以提供最佳的性能和并发性。 选项1:在需要时创建本地实例 public String formatDate(Date d) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return sdf.format(d); } 选项2:将SimpleDateFormat的实例创建为类变量,但同步对其的访问。 private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); public String formatDate(Date d) { synchronized(sdf) { return sdf.format(d); } } 选项3:创建一个ThreadLocal来为每个线程存储一个不同的SimpleDateFormat实例。 private ThreadLocal<SimpleDateFormat> tl = new ThreadLocal<SimpleDateFormat>(); public String formatDate(Date d) { SimpleDateFormat sdf = …

16
我听说i ++不是线程安全的,++ i是线程安全的吗?
我听说i ++不是线程安全的语句,因为在汇编中,i ++减少了将原始值存储为temp的某个地方,然后递增它,然后替换它,这可能会被上下文切换中断。 但是,我想知道++ i。据我所知,这将减少为单个汇编指令,例如“ add r1,r1、1”,并且由于它只是一条指令,因此上下文切换将不会中断该指令。 谁能澄清?我假设正在使用x86平台。
90 c++  c  multithreading 

8
如何使ArrayList成为线程安全的?用Java解决问题的另一种方法?
我有一个ArrayList,我想用来容纳RaceCar对象,这些对象在执行完后立即扩展Thread类。名为Race的类使用RaceCar对象完成执行后调用的回调方法来处理此ArrayList。回调方法addFinisher(RaceCar finisher)将RaceCar对象添加到ArrayList。这应该给出线程完成执行的顺序。 我知道ArrayList不同步,因此不是线程安全的。我尝试使用Collections.synchronizedCollection(c Collection)方法,方法是传入新的ArrayList并将返回的Collection分配给ArrayList。但是,这给了我一个编译器错误: Race.java:41: incompatible types found : java.util.Collection required: java.util.ArrayList finishingOrder = Collections.synchronizedCollection(new ArrayList(numberOfRaceCars)); 以下是相关代码: public class Race implements RaceListener { private Thread[] racers; private ArrayList finishingOrder; //Make an ArrayList to hold RaceCar objects to determine winners finishingOrder = Collections.synchronizedCollection(new ArrayList(numberOfRaceCars)); //Fill array with RaceCar objects for(int i=0; …


6
在调用condition_variable.notify_one()之前是否必须获得锁定?
我对使用有点困惑std::condition_variable。我了解我必须在致电之前创建一个unique_lockon 。我找不到的是在致电或之前是否还应该获得一个唯一的锁。mutexcondition_variable.wait()notify_one()notify_all() cppreference.com上的示例存在冲突。例如,notify_one页面给出了以下示例: #include <iostream> #include <condition_variable> #include <thread> #include <chrono> std::condition_variable cv; std::mutex cv_m; int i = 0; bool done = false; void waits() { std::unique_lock<std::mutex> lk(cv_m); std::cout << "Waiting... \n"; cv.wait(lk, []{return i == 1;}); std::cout << "...finished waiting. i == 1\n"; done = true; } void signals() …

5
了解java.lang.Thread.State:等待(停车)
首先,一个非常愚蠢的问题,我只是想知道等待中的“停车”是什么意思?是线程正在等待驻留,还是线程刚刚处于驻留状态,因此处于等待状态?当发生停车时,会占用多少CPU /内存资源?存放线程的目的是什么? 其次,通过查看Java线程API中的park方法 除非有许可,否则出于线程调度目的禁用当前线程。 如果许可证可用,则将其消耗掉,并立即返回呼叫;否则,呼叫将立即返回。否则,当前线程将出于线程调度目的而被禁用,并处于休眠状态,直到发生三件事之一..... 英语不是我的主要语言,因此我很难理解,我打算将“许可”作为一种“允许线程驻留”,因此出现以下问题: 这是什么意思,什么是“许可证”,以及谁以及如何检查这些许可证? 这是什么意思:“如果有许可证,就被消耗掉了”,它被“停放了”吗? 接下来,如果第二点是正确的,那么“停车”和“休眠”之间有什么区别?如果获得许可,我可以将其永久停放,如果没有,我可以将其“休眠”吗? 谢谢

3
需要了解SemaphoreSlim的用法
这是我的代码,但我不知道SemaphoreSlim在做什么。 async Task WorkerMainAsync() { SemaphoreSlim ss = new SemaphoreSlim(10); List<Task> trackedTasks = new List<Task>(); while (DoMore()) { await ss.WaitAsync(); trackedTasks.Add(Task.Run(() => { DoPollingThenWorkAsync(); ss.Release(); })); } await Task.WhenAll(trackedTasks); } void DoPollingThenWorkAsync() { var msg = Poll(); if (msg != null) { Thread.Sleep(2000); // process the long running CPU-bound job …

7
从服务访问UI线程处理程序
我正在尝试Android上的一些新功能,需要访问UI线程的处理程序。 我知道以下几点: UI线程具有自己的处理程序和循环程序 任何消息都将放入UI线程的消息队列中 循环程序拾取事件并将其传递给处理程序 处理程序处理消息并将特定事件发送到UI 我想拥有必须获取UI线程处理程序并将消息放入此处理程序的服务。这样就可以处理此消息并将其发布到UI。在这里,该服务将是由某些应用程序启动的普通服务。 我想知道这是否可能。如果是这样,请提出一些代码段,以便我可以尝试。 关于吉里什

1
没有打印语句,循环看不到其他线程更改的值
在我的代码中,我有一个循环,等待某个状态从其他线程更改。另一个线程可以工作,但是我的循环从未看到更改过的值。它永远等待。但是,当我System.out.println在循环中放入一条语句时,它突然起作用了!为什么? 以下是我的代码示例: class MyHouse { boolean pizzaArrived = false; void eatPizza() { while (pizzaArrived == false) { //System.out.println("waiting"); } System.out.println("That was delicious!"); } void deliverPizza() { pizzaArrived = true; } } 在while循环运行时,我deliverPizza()从另一个线程调用以设置pizzaArrived变量。但是循环仅在我取消注释该System.out.println("waiting");语句时有效。这是怎么回事?

11
在同一线程上两次调用start方法是否合法?
以下代码导致java.lang.IllegalThreadStateException: Thread already started我第二次调用start()方法时在程序中。 updateUI.join(); if (!updateUI.isAlive()) updateUI.start(); 这是第二次发生updateUI.start()被调用。我已经遍历了好多次,并在点击之前调用了线程并完全运行完成updateUI.start()。 呼唤 updateUI.run()可以避免该错误,但可以使线程在UI线程(如SO上其他文章所述的调用线程)中运行,这不是我想要的。 线程只能启动一次吗?如果是这样,那么如果我想再次运行线程该怎么办?如果我没有在线程中执行此特定线程,而不是在UI线程中完成该特定线程,则该线程在后台进行了计算,并且用户等待时间过长。


3
Windows的PHP线程安全和非线程安全
我正在下载Windows的PHP。我在网站上有2个选择。 PHP线程安全 PHP非线程安全 请回答以下问题: 两者有什么区别?彼此之间的优缺点是什么? 我正在开发一个电子商务网站,该网站的流量很大,更推荐哪个网站,为什么?


9
监控与锁定
什么时候在C#中使用Monitor类或lock关键字来确保线程安全? 编辑: 从到目前为止的答案看来,这lock是对该Monitor课程的一系列电话的简称。锁定调用简写的确切含义是什么?更明确地说, class LockVsMonitor { private readonly object LockObject = new object(); public void DoThreadSafeSomethingWithLock(Action action) { lock (LockObject) { action.Invoke(); } } public void DoThreadSafeSomethingWithMonitor(Action action) { // What goes here ? } } 更新资料 谢谢大家的帮助:作为您提供的某些信息的后续,我还发布了另一个问题。由于您似乎对此领域很精通,因此我发布了链接:锁定和管理锁定异常的解决方案有什么问题?

4
JavaFX中的Platform.runLater和Task
我一直在对此进行一些研究,但至少可以说我还是很困惑。 谁能给我一个何时使用Task以及何时使用的具体示例Platform.runLater(Runnable);?到底有什么区别?何时使用这些方法是否有黄金法则? 如果我错了,也可以纠正我,但是这两个“对象”不是在GUI主线程内(用于更新GUI)创建另一个线程的方法吗?

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.