13-26~27 suspend(), resume(), stop()


  • スレッドの実行を一時停止、リカバリ、および完全に停止します.
  • suspend()、resume()、stop()は硬直状態に陥りやすく廃棄される.
  • は、以下のように直接実施することができる.
  • // 구현
    class MyThread implements Runnable {
        volatile boolean suspended = false;	// 쉽게 바뀌는 변수
        volatile boolean stopped = false;
        
        Thread th;
        
        MyThread(String name){
        	th = new Thread(this, name);	// Thread(Runnable r, String name)
        }
        
        public void run() {
        	while(!stopped) {
            	if(!suspended) {
                	/* 쓰레드가 수행할 코드를 작성 */
                    System.out.println(Thread.currentThread().getName());
                    try{
                        Thread.sleep(1000);
                    } catch(InterruptedException e) {}
                }
            }
        }
        public void suspend() { suspended =true; }
        public void resume() { suspended =false; }
        public void stop() { stopped = true; }
    }
    // 사용
    public practice {
        public static void main(String args[]){
        	MyThread th1 = new MyThread("*");
            MyThread th2 = new MyThread("**");
            MyThread th3 = new MyThread("***");
            th1.start();
            th2.start();
            th3.start();
            
            try {
                Thread.sleep(2000);
                th1.suspend();	// 쓰레드 th1을 잠시 중단시킨다.
                Thread.sleep(2000);
                th2.suspend();	// 쓰레드 th2를 잠시 중단시킨다.
                Thread.sleep(3000);
                th1.resume();	// 쓰레드 th1을 다시 동작시킨다.
                Thread.sleep(3000);
                th1.stop();	// 쓰레드 th1을 강제 종료시킨다.
                th2.stop();	// 쓰레드 th2를 강제 종료시킨다.
                Thread.sleep(2000);
                th3.stop();	// 쓰레드 th3를 강제 종료시킨다.
            } catch (InterruptedException e) {}
        }
    }
    volatile
  • RAMの変数保留値falseをCPUのカーネルにコピーして、より高速な動作速度を実現します.
  • RAMが所有する元の保留値がfalseからtrueに変更されると、キャッシュメモリのコピー保留値は変更されません.
  • volatileを加えると、コピーを使わずにRAMの原本を直接読みます.
  • は常に変化する値なので、コピーを書くのではなく、オリジナルから値を取得します.