多线程中解决死锁的问题

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event

{

//主队列异步

//    [self mainQueueAsync];

//主队列同步

//    [self mainQueueSync];

//解决死锁

[self demo];

}

//解决死锁

- (void)demo

{

NSLog(@"begin");

//异步

dispatch_async(dispatch_get_global_queue(0, 0), ^{

//主队列 主队列执行任务只有当主线程空闲的时候才能够执行

dispatch_queue_t mainQueue = dispatch_get_main_queue();

//2.任务

dispatch_block_t task1 = ^ {

[NSThread sleepForTimeInterval:1.0];

NSLog(@"task1 %@",[NSThread currentThread]);

};

dispatch_block_t task2 = ^ {

NSLog(@"task2 %@",[NSThread currentThread]);

};

//同步

dispatch_sync(mainQueue, task1);

dispatch_sync(mainQueue, task2);

});

NSLog(@"end");

}

//主队列同步 死锁

- (void)mainQueueSync

{

NSLog(@"begin");

//主队列 主队列执行任务只有当主线程空闲的时候才能够执行

dispatch_queue_t mainQueue = dispatch_get_main_queue();

//2.任务

dispatch_block_t task1 = ^ {

[NSThread sleepForTimeInterval:1.0];

NSLog(@"task1 %@",[NSThread currentThread]);

};

dispatch_block_t task2 = ^ {

NSLog(@"task2 %@",[NSThread currentThread]);

};

//同步

dispatch_sync(mainQueue, task1);

dispatch_sync(mainQueue, task2);

NSLog(@"end");

}

//主队列异步 主队列的任务只在主线程执行 任务是依次执行的

- (void)mainQueueAsync

{

//主队列

dispatch_queue_t mainQueue = dispatch_get_main_queue();

//2.任务

dispatch_block_t task1 = ^ {

[NSThread sleepForTimeInterval:1.0];

NSLog(@"task1 %@",[NSThread currentThread]);

};

dispatch_block_t task2 = ^ {

NSLog(@"task2 %@",[NSThread currentThread]);

};

//异步

dispatch_async(mainQueue, task1);

dispatch_async(mainQueue, task2);

}

时间: 2024-10-12 19:37:31

多线程中解决死锁的问题的相关文章

Java多线程中的死锁问题[转]

//申明:本文转载自http://www.cnblogs.com/digdeep/p/4448148.html <Java多线程中的死锁问题> Java程序基本都要涉及到多线程,而在多线程环境中不可避免的要遇到线程死锁的问题.Java不像数据库那么能够检测到死锁,然后进行处理,Java中的死锁问题,只能通过程序员自己写代码时避免引入死锁的可能性来解决. 1. Java中导致死锁的原因 Java中死锁最简单的情况是,一个线程T1持有锁L1并且申请获得锁L2,而另一个线程T2持有锁L2并且申请获得

SQL Server中解决死锁的新方法介绍

SQL Server中解决死锁的新方法介绍 数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法. 将下面的SQL语句放在两个不同的连接里面,并且在5秒内同时执行,将会发生死锁. <ccid_nobr> <ccid_code>use Northwindbegin tran insert into Orders(CustomerId) values(@#[email protected]#)

SQL Server中解决死锁

SQL Server中解决死锁的新方法介绍 数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法. 将下面的SQL语句放在两个不同的连接里面,并且在5秒内同时执行,将会发生死锁. <ccid_nobr> <ccid_code>use Northwindbegin tran insert into Orders(CustomerId) values(@#[email protected]#)

多线程中的死锁举例与分析(转)

1. 一个特殊构造的程序考虑下面这个专门为说明多线程中的死锁现象而构造的程序: import java.util.LinkedList; public class Stack { public static void main(String[] args) { final Stack stack = new Stack(); new Thread("push") { @Override public void run() { for (int i = 0; i < 100; i+

Java多线程中的死锁问题

Java程序基本都要涉及到多线程,而在多线程环境中不可避免的要遇到线程死锁的问题.Java不像数据库那么能够检测到死锁,然后进行处理,Java中的死锁问题,只能通过程序员自己写代码时避免引入死锁的可能性来解决. 1. Java中导致死锁的原因 Java中死锁最简单的情况是,一个线程T1持有锁L1并且申请获得锁L2,而另一个线程T2持有锁L2并且申请获得锁L1,因为默认的锁申请操作都是阻塞的,所以线程T1和T2永远被阻塞了.导致了死锁.这是最容易理解也是最简单的死锁的形式.但是实际环境中的死锁往往

java多线程中的死锁

产生死锁的原因:多个线程用到了多个锁,多个锁之间存在交叉关系,就有可能产生死锁. 下面是简单的死锁,下面代码中的死锁不是一定会产生. package demo_1; public class TestDeadLock { public static void main(String[] args) { Thread1 thread1 = new Thread1(); Thread2 thread2 = new Thread2(); Thread t1 = new Thread(thread1);

NET中解决KafKa多线程发送多主题的问题

一般在KafKa消费程序中消费可以设置多个主题,那在同一程序中需要向KafKa发送不同主题的消息,如异常需要发到异常主题,正常的发送到正常的主题,这时候就需要实例化多个主题,然后逐个发送. 在NET中用RdKafka组件来做消息处理,在Nuget中引用. 在程序中初始化Producer,并创建多个Topic private string comtopic = "topic1"; private string errtopic = "topic2"; private

解决DataGridView在多线程中无法显示滚动条的问题

原文:解决DataGridView在多线程中无法显示滚动条的问题 在多线程中对DataGridView指定 DataSource 来填充数据,更新数据的时候,会导致DataGridView出现假死,显示错误或者滚动条无法显示的问题,在保证了DataGridView的ScrollBars设置为了Both,数据量大于DataGridView显示的的范围,而且没有冻结列的情况下,解决方法如下: 一是使用 Invoke 将执行数据绑定的代码交回给主线程(因为 DataGridView 是主线程创建的):

Java程序中解决数据库超时与死锁

Java程序中解决数据库超时与死锁 2011-06-07 11:09 佚名 帮考网 字号:T | T Java程序中解决数据库超时与死锁,每个使用关系型数据库的程序都可能遇到数据死锁或不可用的情况,而这些情况需要在代码中编程来解决.本文主要介绍与数据库事务死锁等情况相关的重试逻辑概念. AD: Java程序中解决数据库超时与死锁,每个使用关系型数据库的程序都可能遇到数据死锁或不可用的情况,而这些情况需要在代码中编程来解决;本文主要介绍与数据库事务死锁等情况相关的重试逻辑概念,此外,还会探讨如何避