使用信号量[关闭](Using a semaphore [closed])
我想知道如何让这些线程一个接一个地工作,以及如何使第一个始终在第二个之后运行。 我创建了一个信号量,但我不确定如何使用它。
public class A extends Thread { private int i; public A(int x) { i = x; }@ Override public void run() { System.out.println(i); } }
/ **主要** /
A c1 = new A(5); A c2 = new A(6); Semaphore s = new Semaphore(1, true); c1.start(); c2.start(); new Thread(new Runnable() { public void run() { for (int i = 0; i < 10; i++) { try { Thread.sleep(100); } catch (InterruptedException e) {} System.out.println("+"); } } }).start(); new Thread(new Runnable() { public void run() { for (int i = 0; i < 10; i++) { try { Thread.sleep(70); } catch (InterruptedException e) {} System.out.println("*"); } } }).start();
I would like to know how can i make those thread work one after the other, and how to make the first one always run after the second one. I created a semaphore, but i not sure about how to use it.
public class A extends Thread { private int i; public A(int x) { i = x; }@ Override public void run() { System.out.println(i); } }
/** IN MAIN **/
A c1 = new A(5); A c2 = new A(6); Semaphore s = new Semaphore(1, true); c1.start(); c2.start(); new Thread(new Runnable() { public void run() { for (int i = 0; i < 10; i++) { try { Thread.sleep(100); } catch (InterruptedException e) {} System.out.println("+"); } } }).start(); new Thread(new Runnable() { public void run() { for (int i = 0; i < 10; i++) { try { Thread.sleep(70); } catch (InterruptedException e) {} System.out.println("*"); } } }).start();
原文:https://stackoverflow.com/questions/30314966
最满意答案
如果
isTemporaryID
在ContextA中返回NO,则这是安全的。 否则,保存临时对象时,将创建一个新ID,您可能无法在ContextB中找到它。如果ContextA和ContextB是在不同的线程上创建的,并且您希望在两者中访问同一个对象,则需要执行的操作。
This is safe if
isTemporaryID
returns NO in ContextA. Otherwise, when the temporary object is saved, a new ID will be created and you might not find it in ContextB.What you are doing is required if ContextA and ContextB were created on different threads and you want to access the same object in both.
相关问答
更多-
如何将NSManagedObject从一个上下文复制或移动到另一个上下文?(How do I copy or move an NSManagedObject from one context to another?)[2021-12-08]
首先,在单个线程上拥有多个NSManagedObjectContext 不是标准配置。 99%的时间你只需要一个上下文,这将为你解决这个问题。 为什么你觉得你需要多个NSManagedObjectContext ? 更新 这实际上是我看到有用的几个用例之一。 为此,您需要将对象的递归副本从一个上下文到另一个上下文。 工作流程如下: 在持久上下文中创建新对象 从源对象获取属性的字典(使用-dictionaryWithValuesForKeys和-[NSEntityDescription attributesB ... -
NSManagedObjectContext是应用程序对象图的内存容器,就像持久性存储(XML,SQLite等)通常表示对象图的磁盘容器一样。 这种方法有一些优点: 错误可以应用于一组对象,或者在CoreData的情况下整个对象图 这是一个强制应用程序批量处理I / O的方便抽象。 它提供了一个单一的联系点,以便在整个对象图上有效地执行操作(NSFetchRequests等) 撤销可以应用于对象图,而不仅仅是单个对象。 记住CoreData不是一个ORM框架也是重要的,它是一个对象持久性框架。 CoreDa ...
-
我认为创建一个新实体并删除旧实体是一个有问题的策略。 您应该尝试正确更新现有实体,如果它们尚不存在,则只创建新实体。 每当我需要来自不同上下文的对象时,我就会获取它。 话虽这么说,你的对象id代码应该工作。 但是,可能存在各种其他故障,您应该检查: 你保存了importContext吗? 您是否保存了其父上下文,可能是主要上下文? 修改后的对象图是否已保存到持久性存储中? 保存后是否检查结果? I think creating a new entity and deleting the old one is ...
-
保存后,我的NSManagedObjectID仍然是临时的。(My NSManagedObjectID is still temporary after saving. But why?)[2022-05-04]
保存更改时,新的NSManagedObject实例将获取新的对象ID。 以前存在的NSManagedObjectID实例未就地转换,它们将替换为新实例。 但是您必须向托管对象询问其新ID。 在您的情况下,您在保存之前保存了一组对象ID。 即使您保存更改,这些对象也永远不会更改。 但是,如果您回到托管对象并再次询问它们的对象ID,您将得到不同的结果,这不是暂时的。 When you save changes, new NSManagedObject instances get a new object ID. ... -
受过教育的猜测,因为它是一个实现细节: p表示永久性,因为对象已保存到商店。 即[objectID isTemporaryID] == NO 。 如果对象尚未保存,那将是一个问题。 即[objectID isTemporaryID] == YES 。 Educated guess, because it's an implementation detail: The p means something like permanent, because the object has been saved to ...
-
保存后,在子上下文中创建的新对象在父上下文中不存在(New object created in child context doesn't exist in parent context after saving)[2023-04-02]
将新对象保存到永久存储时,将获得新的NSManagedObjectID。 在保存之前,您可以调用obtainPermanentIDsForObjects来获取永久ID。 [childContext obtainPermanentIDsForObjects:@[obj] error:&error]; NSManagedObjectID *objID = [obj ObjectID]; A new object will get a new NSManagedObjectID when it is saved ... -
如果isTemporaryID在ContextA中返回NO,则这是安全的。 否则,保存临时对象时,将创建一个新ID,您可能无法在ContextB中找到它。 如果ContextA和ContextB是在不同的线程上创建的,并且您希望在两者中访问同一个对象,则需要执行的操作。 This is safe if isTemporaryID returns NO in ContextA. Otherwise, when the temporary object is saved, a new ID will be cr ...
-
创建子上下文然后从父上下文中获取似乎没有多大意义。 我不相信这就是儿童语境被设想使用的方式。 为了消除混淆:在从父上下文创建子上下文之后,该子上下文与父上下文具有相同的“状态”。 只有当两个上下文执行不同的操作(创建,修改,删除对象)时,两个上下文的内容才会发生分歧。 因此,对于您的设置,请执行以下操作: 创建子上下文 做你想做的工作(从下载的数据修改或创建对象), 保存子上下文 在此阶段,尚未将任何内容保存到持久性存储中。 通过子保存,更改只是“推送”到父上下文。 你现在可以 保存父上下文 将新数据写入持 ...
-
为什么不在Object建立一个to-one关系属性称为interaction ,它指向一个Entity的实例 - 反之,从Entity到Object的多对多关系称为interactions ? 这很好地解决了这个问题,没有所有的转换方法。 但您也可以查看-managedObjectIDForURIRepresentation:和+URLWithString:方法以转向另一个方向。 Why not just establish a to-one relationship property in Object ...
-
您正在循环遍历数组,但实际上从未将OwedId更改为您在数组中查看的项目。 这应该工作: BOOL Found = NO; OwedMoney *Object; for (OwedMoney *OwedObject in youOweArray) { NSManagedObjectID *OwedId = [OwedObject objectID]; NSLog(@"%@", OwedObject); if (OwedId == moID) { Fou ...