develop
Thread 본문
반응형
모든 언어에서 일반적으로 사용되는 병렬프로그래밍 기술인 멀티스레드
하지만 아래의 다른 병렬프로그래밍 기술보다 사용하기가 까다롭고 비효율적이다.
Thread에는 Selector을 사용할수 있는 생성자와 block구문을 이용한 생성자가 있다.
@available(iOS 2.0, *)
public convenience init(target: Any, selector: Selector, object argument: Any?)
@available(iOS 10.0, *)
public convenience init(block: @escaping () -> Void)
Selector을 사용하는 방법이다.
override func viewDidLoad() {
let thread1 = Thread(target: self, selector: #selector(self.threadSelector(_:)), object: "Thread1")
thread1.start()
let thread2 = Thread(target: self, selector: #selector(self.threadSelector(_:)), object: "Thread2")
thread2.start()
}
@objc private func threadSelector(_ sender: Any?) {
(0...3).forEach({ print("sender: \(sender), value: \($0)") })
}
sender: Optional(Thread2), value: 0
sender: Optional(Thread1), value: 0
sender: Optional(Thread2), value: 1
sender: Optional(Thread1), value: 1
sender: Optional(Thread1), value: 2
sender: Optional(Thread1), value: 3
sender: Optional(Thread2), value: 2
sender: Optional(Thread2), value: 3
block을 이용해 보았다.
Thread {
(1...5).forEach({ print("Thread1: \($0)") })
}.start()
Thread {
(1...5).forEach({ print("Thread2: \($0)") })
}.start()
Thread1: 1
Thread2: 1
Thread1: 2
Thread2: 2
Thread1: 3
Thread2: 3
detachNewThread type 메서드로 쓰레드를 바로 사용할 수 있다.
Thread.detachNewThread {
(1...3).forEach({ print("Thread1: \($0)") })
}
Thread.detachNewThread {
(1...3).forEach({ print("Thread2: \($0)") })
}
Thread1: 1
Thread2: 1
Thread1: 2
Thread2: 2
Thread1: 3
Thread2: 3
Thread의 메서드를 알아보겠다.
let thread = Thread {
(1...3).forEach({ print("Thread: \($0)") })
}
thread.start()
Thread: 1
Thread: 2
Thread: 3
start는 Thread를 실행하게 만드는 메서드이다.
cancel은 Thread를 취소하는 메서드이다.
main이란 함수가 있는데 공식 홈페이지에서의 설명은
The default implementation of this method takes the target and selector used to initialize the receiver and invokes the selector on the specified target. If you subclass NSThread, you can override this method and use it to implement the main body of your thread instead. If you do so, you do not need to invoke super. You should never invoke this method directly. You should always start your thread by invoking the start method.
직접 호출하면 안되고 start 메서드를 사용하라고 한다.
print("isMainThread: \(Thread.isMainThread)")
Thread.detachNewThread {
print("isMainThread: \(Thread.isMainThread)")
}
isMainThread: true
isMainThread: false
Thread에 isMainThread 타입 프로퍼티를 확인하면 MainThread에서 작동하는지 확인 할 수 있다.
let thread = Thread {
print("thread")
}
print("isMainThread: \(thread.isMainThread)")
print("isCancelled: \(thread.isCancelled)")
print("isFinished: \(thread.isFinished)")
thread.start()
sleep(1)
print("isCancelled: \(thread.isCancelled)")
print("isFinished: \(thread.isFinished)")
isMainThread: false
isCancelled: false
isFinished: false
thread
isCancelled: false
isFinished: true
isMainThread로 Main Thread인지 확인할 수 있고
isCancelled로 취소된 Thread인지 체크할 수 있다.
isFinished는 완료된 Thread인지 체크할 수 있다.
let thread = Thread {
print("thread")
}
thread.cancel()
thread.start()
sleep(1)
print("isCancelled: \(thread.isCancelled)")
print("isFinished: \(thread.isFinished)")
isCancelled: true
isFinished: true
let thread = Thread {
print("thread start")
sleep(2)
print("thread end")
}
print("isExecuting: \(thread.isExecuting)")
thread.start()
sleep(1)
print("isExecuting: \(thread.isExecuting)")
sleep(2)
print("isExecuting: \(thread.isExecuting)")
isExecuting: false
thread start
isExecuting: true
thread end
isExecuting: false
isExecuting은 Thread가 실행중인지 확인 할 수 있다.
더 많은 프로퍼티와 메서드는 공식 홈페이지에서 확인 할 수 있다.
반응형
'iOS' 카테고리의 다른 글
GCD (0) | 2021.02.06 |
---|---|
OperationQueue (0) | 2021.02.05 |
DispatchWorkItem (0) | 2021.02.03 |
LazySequence (0) | 2021.02.02 |
Property(Stored Property, Lazy Property, Computed Property, Property Observers, Type Property) (0) | 2021.02.01 |
Comments