안드로이드:thread의 끝, 일시 중지 및 복구
5915 단어 thread 비동기
그러나 여기에 오류가 있습니다. 몇몇 사람들은 다중 루트 개발을 할 때 우리가 루트를 만드는Activity에서 종료하면 (이Acitivity가 삭제됩니다) 이 Activity에서 만든 사용자 정의 루트도 삭제된다고 착각할 수 있습니다.사실 이것은 큰 잘못이다.
상술한 상황에서 만들어진 라인은 자동으로 소각되지 않고 백엔드에서 묵묵히 실행되며 스스로 끝날 때까지 실행된다는 것이 실증되었다.안드로이드의 이런 디자인은 나무랄 데가 없다.이론적으로 해석하면 응용의 최소 집행 단위는 라인이고 최소 자원 단위는 프로세스이다. 한 프로세스는 여러 개의 라인을 포함할 수 있고 여러 개의 라인은 같은 소속 프로세스의 자원을 공유한다.따라서 개인적으로 안드로이드의 응용은 하나의 프로세스이고 그 안의 모든 UI,Activity는 이 프로세스에 속하는 루트이다. 하나의Activity에서 다른Activity로 들어가는 본질은 이전의 루트를 끊고 뒤의 루트를 만드는 것이다.물러나는 것도 일리가 있다.사용자 정의 라인도 이 원칙을 따른다.어떤 라인이 끝나는 것을 제어하지 않으면, 이 라인이 실행되거나 소속된 프로세스가 소각되어야만, 이 라인이 진정으로 끝날 수 있다.
결론적으로 우리가 사용자 정의 라인이 아직 실행되지 않은 상황에서 관련 동작을 끝내야 할 때 우리는 관련 라인을 끝내야 한다고 생각해야 한다.예를 들어 검색 과정에서 우리는 계속 검색하고 싶지 않고 검색 기능을 종료했다. 이때 우리는 사용자 정의 검색 라인을 끝내야 한다.그렇지 않으면 심각한 착오를 초래할 수 있다.예를 들어, 우리는 반복적으로 검색 기능에 들어가서 검색이 끝나지 않았을 때 종료한 후에 다시 들어간다.이러한 상황에서 이전의 사용자 정의 라인이 끝나지 않았고, 이후에 여러 개의 새로운 검색 라인이 만들어져 실행되기 때문에 임계 구역 충돌을 초래하여 장치가 다운되기 쉽다.
그러면 우리는 어떻게 이런 사용자 정의 라인을 제어합니까?아래의 필자는 상세하게 설명할 것이다.
하나.라인의 끝
사실 도움말 문서를 통해 안드로이드의 루틴 클래스 자체가 루틴을 끝내는 공공적인 방법을 제공했다는 것을 알 수 있다.
void destroy()
This method is deprecated. Not implemented.
synchronized final void stop(Throwable throwable)
This method is deprecated. because stopping a thread in this manner is unsafe and can leave your application and the VM in an unpredictable state.
final void stop()
This method is deprecated. because stopping a thread in this manner is unsafe and can leave your application and the VM in an unpredictable state
그러나 설명을 통해 알 수 있듯이 이러한 방법은 안드로이드 자체가 사용하는 것을 추천하지 않는다. 이런 방식으로 라인을 끝내는 것은 안전하지 않고 우리의 응용을 종료시키고 가상 기기를 예측할 수 없는 상태로 만들 수 있다.그러면 개발 과정에서 합리적인 수요에서 우리는 어떻게 지정된 사용자 정의 라인을 안전하게 끝낼 수 있습니까?필자가 구원하러 왔다.
1. 우리는 사용자 정의 루틴 클래스에서 브릴 사유 변수를 정의하고 가짜로 초기화하여 루틴의 실행 상태를 기록할 수 있다.
2. 런 함수에서 시작하여 이 변수를 진실로 설정하면 라인이 실행 상태에 들어간 것을 나타낸다.
3. 런 함수 끝 위치에서 이 변수를 가짜로 설정하면 라인이 끝 상태에 들어간 것을 나타낸다.
4.run의 루틴 실행 부분에서 우리는 이 변수를 판단하기 위해 끈기를 찾을 수 있다. 만약에 진짜라면 계속 실행하지 않으면 run 함수를 종료할 수 있다.
5. 사용자 정의 루틴 클래스에 공공 함수를 제공한다. 이 함수의 역할은 상기 상태 변수를 가짜로 설정하는 것이다.
이렇게 하면 사용자 정의 루틴 실행이 아직 끝나지 않았을 때, 우리는 5가지 방법으로 루틴을 안전하게 끝낼 수 있다.
사상의 본질은 우리가 안전하게 라인을 강제로 끝낼 수 없으니 안전하게 라인을 앞당겨 물러나게 하는 것이다.효과는 같다.
프로그램 인스턴스:
class SearchThread extends Thread {
private Object mPauseLock;
private boolean mPauseFlag;
public SearchThread() {
mPauseLock = new Object();
mPauseFlag = false;
}
public void onPause_thread() {
synchronized (mPauseLock) {
mPauseFlag = true;
}
}
public void onResume_thread() {
synchronized (mPauseLock) {
mPauseFlag = false;
mPauseLock.notifyAll();
}
}
private void pauseThread() {
synchronized (mPauseLock) {
if (mPauseFlag) {
try {
mPauseLock.wait();
} catch (Exception e) {
Log.v("thread", "fails");
}
}
}
}
@Override
public void run() {
//--- , -----
while (!mPauseFlag) {
try {
pauseThread();
if (err_video)
mHandler.obtainMessage(ERROR_HANDLE)
.sendToTarget();
Thread.sleep(5000);
Log.e("robin debug", "thread.go");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
Android , , 。 , 。java Thread suspend resume , , , , , , , ( !)
( ), , , 。 , :
private class MyThread extends Thread {
private final Object lock = new Object();
private boolean pause = false;
/**
*
*/
void pauseThread() {
pause = true;
}
/**
*
*/
void resumeThread() {
pause = false;
synchronized (lock) {
lock.notifyAll();
}
}
/**
* : run , ,
*/
void onPause() {
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
@Override
public void run() {
super.run();
try {
int index = 0;
while (true) {
//
while (pause) {
onPause();
}
try {
System.out.println(index);
Thread.sleep(50);
++index;
} catch (InterruptedException e) {
// , break
break;
}
}
} catch (NullPointerException e) {
e.printStackTrace();
}
}
}
, , , myThread.wait() , 。 onPause() run , 。
? , :
MyThread my = new MyThread();
Thread thread = new Thread(my);
thread.start();
, :
pauseThread();
:
resumeThread(); thead.interrupt(); , InterruptedException ,
while catch break; ,