2016-10-12 75 views
0

我運行一個函數doTask在另一個線程象下面這樣:殺死另一個線程在我的情況

NSThread *otherThread = [[NSThread alloc] initWithTarget:self 
               selector:@selector(doTask) 
                object:nil]; 
[otherThread start]; 

... 
-(void)doTask{ 
    ... 
} 

什麼是從當前線程殺otherThread的正確方法?

我知道[otherThread cancel]只是標誌着otherThread應該被殺但不是真的殺死它。

+0

總是最好*要求*另一個線程終止,而不是*告訴*它。這樣會更清潔。 – Droppy

+0

是的,我明白了,但在我的情況下,我可以讓其他線程終止? –

+0

未知;這取決於類之間的關係。 – Droppy

回答

-1

在使計時器無效或停止線程當前正在運行的其他耗時操作之後,您可以調用[otherThread cancel]。如果你正確地清理並且調用取消它應該殺死線程。

+0

但是'exit'是一個類方法而不是NSThread中的一個實例方法。 –

+0

愚蠢的,我的錯誤。你在doTask裏面運行什麼樣的任務? – Yord

0

doTask需要定期檢查某個狀態以查看是否需要儘早終止。一個簡單的BOOL就夠了。

@interface MyTask:NSObject 
@property(atomic) BOOL keepGoing; 
@end 

@implementation MyTask 
- (void) calculate 
{ 
    while(_keepGoing && _workQueueHasStuff) { 
     .... process some stuff .... 
    } 
    if (!_keepGoing) { 
     ... early termination ... 
    } else { 
     ... work queue depleted ... 
    } 
} 

或者,如S,S說,使用isCancelled/-cancel API如預期


不能從線程之外直接殺死一個線程。