

制御が出来ません。何がいけないのですか？

[code]

    package com.company;
    
    
    import java.io.*;
    import java.util.*;
    import java.util.concurrent.TimeUnit;
    
    
    public class Main  {
        static boolean b = true;
        static Thread stdRun  = null;
        public static void main(String[] args)  {
    
            Runnable inputStreamThread = new Runnable(){
                public void run(){
    
                    while(b){
                        try{
                            //System.out.println("Thread stdRun start");
                            TimerTask task = new TimerTask() {
                                public void run() {
                                    b=false;
                                }
                            };
                            Timer timer = new java.util.Timer();
                            timer.schedule(task, TimeUnit.SECONDS.toMillis(1));
                            while(true){
                                System.out.println("テスト");
                                Thread.sleep(200);
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        b=false;
                    }
    
                }
    
            };
    
            stdRun = new Thread(inputStreamThread);
                /* スレッドを開始します。 */
            stdRun.start();
    
                /* スレッドが終了するのを待機 */
            try {
                stdRun.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            System.out.println("スレッドは正常に終了");
    
        }
    }
    
[/code]


CC BY-SA 3.0
2016-03-23T21:14:38.670
23399
2016-03-30T03:07:11.307
2016-03-23T21:16:57.970
3605
14913
question
java
スレッドをタイムスケジュールで終了させるプログラム


もう少しやりたいことを明確にしていただけると助かるのですが、こういうことでしょうか?

[code]

    import java.io.*;
    import java.util.*;
    import java.util.concurrent.TimeUnit;
    
    public class test {
        static boolean b = true;
        static Thread stdRun  = null;
        public static void main(String[] args)  {
    
            Runnable inputStreamThread = new Runnable(){
                public void run(){
    
                    try{
                        //System.out.println("Thread stdRun start");
                        TimerTask task = new TimerTask() {
                            public void run() {
                                System.out.println("run");
                                stdRun.interrupt();
                            }
                        };
                        Timer timer = new java.util.Timer();
                        timer.schedule(task, TimeUnit.SECONDS.toMillis(1));
    
                        while (true) {
                            System.out.println("テスト");
                            Thread.sleep(200);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
    
            };
    
            stdRun = new Thread(inputStreamThread);
                /* スレッドを開始します。 */
            stdRun.start();
    
                /* スレッドが終了するのを待機 */
            try {
                stdRun.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            System.out.println("スレッドは正常に終了");
    
        }
    }
    
[/code]


CC BY-SA 3.0
2016-03-23T22:25:26.000
23400
2016-03-24T11:33:21.760
2016-03-24T11:33:21.760
5288
5288
23399
answer


ん…それでは無限ループしますよ？

timer.schedule() のあとの while で無限ループしているので  
タイマーが作動しても while(b) は一生実行されません。

タイマータスクでスレッドを強制終了（kill）などしているなら話は別ですが、  
今回はフラグを変えているだけなので一定時間にフラグを見る処理すなわち

timer.schedule() の下の while(true) は while(b) とすべきです。

それだと最初の行の while(b) の存在意味がよくわからなくなりますが、なにか事情があるのでしょう


CC BY-SA 3.0
2016-03-30T03:02:03.573
23605
2016-03-30T03:07:11.307
2016-03-30T03:07:11.307
10346
10346
23399
answer