1 1. 三种创建线程的方法
2
3 //第一种
4
5 NSThread * thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(doAction) object:nil];
6
7 //线程名
8
9 thread1.name = @"thread1";
10
11 //线程优先级,0 ~ 1
12
13 thread1.threadPriority = 1.0;
14
15 //开启线程
16
17 [thread1 start];
18
19 //第二种
20
21 //通过类方法创建线程,不用显示的开启start
22
23 [NSThread detachNewThreadSelector:@selector(doAction) toTarget:self withObject:nil];
24
25 //第三种
26
27 //隐式创建多线程
28
29 [self performSelectorInBackground:@selector(doAction:) withObject:nil];
30
31
32
33
34
35 @implementation ViewController
36
37 - (void)viewDidLoad {
38
39 [super viewDidLoad];
40
41 // Do any additional setup after loading the view, typically from a nib.
42
43
44
45
46
47 NSLog(@"mainThread - %@",[NSThread mainThread]);
48
49
50
51 NSThread * thread = [[NSThread alloc] initWithTarget:self selector:@selector(handleAction) object:nil];
52
53
54
55 //就绪状态
56
57 [thread start];
58
59 }
60
61
62
63 - (void)handleAction {
64
65
66
67 for (NSInteger i = 0 ; i < 100; i ++) {
68
69
70
71 //阻塞状态
72
73 // [NSThread sleepForTimeInterval:2];
74
75 // [NSThread sleepUntilDate:[NSDate dateWithTimeIntervalSinceNow:2]];
76
77
78
79 // NSLog(@"%@,%@",[NSThread currentThread],@(i));
80
81 //可以在子线程获取主线程
82
83 NSLog(@"mainThread - %@",[NSThread mainThread]);
84
85 if (i == 10) {
86
87 //退出
88
89 [NSThread exit];
90
91 }
92
93 }
94
95 }
96
97 3.同步代码块实现买票功能
98
99 @implementation ViewController
100
101
102
103 - (void)viewDidLoad {
104
105 [super viewDidLoad];
106
107 // Do any additional setup after loading the view, typically from a nib.
108
109
110
111 self.tickets = 20;
112
113
114
115 NSThread * thread1 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
116
117 // thread1.name = @"computer";
118
119
120
121 [thread1 start];
122
123
124
125
126
127 NSThread * thread2 = [[NSThread alloc] initWithTarget:self selector:@selector(saleTicket) object:nil];
128
129 // thread2.name = @"phone";
130
131
132
133 [thread2 start];
134
135 }
136
137
138
139 - (void)saleTicket {
140
141
142
143
144
145 while (1) {
146
147
148
149 // [NSThread sleepForTimeInterval:1];
150
151
152
153
154
155 //token必须所有线程都能访问到,一般用self
156
157
158
159 // @synchronized() {
160
161
162
163 //代码段
164
165 // }
166
167
168
169
170
171 // NSObject * o = [[NSObject alloc] init];
172
173
174
175 //互斥锁
176
177 @synchronized(self) {
178
179
180
181 [NSThread sleepForTimeInterval:2];
182
183
184
185 if (self.tickets > 0) {
186
187
188
189 NSLog(@"%@ 还有余票 %@ 张",[NSThread currentThread],@(self.tickets));
190
191
192
193 self.tickets -- ;
194
195
196
197 } else {
198
199
200
201 NSLog(@"票卖完了");
202
203
204
205 break;
206
207 }
208
209
210
211 }
212
213
214
215 }
216
217
218
219 }
220
221