解决方案 »

  1.   

    1.可以自己设置一个标志位flag,加一个while循环,当让它运行时设置为true,不想让它运行时设置flase;
    2. 用interrupt 当出现sleep时会出现异常,进不去停止;
      

  2.   

    用标志位,根据标志位去break。
      

  3.   


    感觉没有地方放这个循环啊,举个例子吧,我的程序类似于:
    a();
    b();
    c();
    按顺序调用这3个函数,每个函数可能会执行1分钟。我希望在任意时刻能够中断。按照标志位的想法,我是不是需要在每一个函数中都判断这个标志位,先中断函数的执行,再中断我的这个线程?
      

  4.   

    private boolean closed=true;public void setClosed(boolean closed){
      this.closed =closed;
    }public void run(){while(close){  .............
    }
    }
      

  5.   

    线程推出,执行完了就会推出interrupt终止线程主要是终止那种因为阻塞而迟迟无法执行完的那种线程,当然也包括复杂计算导致执行时间很长的线程。对于阻塞的线程,interrupt的响应是自动的,某些无法被interrupt拿它是没办法的。某些会响应interrupt的阻塞会自动抛出异常,例如sleep。对于长时间计算的线程,需要你自己去检查Thread的interrupt标志,如果interrupt已经被设置,就应该响应,可以抛出interrupt异常也可以自己设计出口直接将线程结束掉。
      

  6.   


    看过这篇文章,文章也提了,标志位的方法适合于程序循环运行时,因为循环可以保证定时检查标志位。
    而我的程序是线性执行的,不太可能每执行一部操作就写一个语句来判断标志位的状态。而对于interrupt的方法,我的程序没有sleep的状态,所以应该不太适用于抛出异常的方法。
    而判断interrupt状态的方法,同样需要定期判断这个状态,感觉上和标志位的方法差不多,同样没法很好的解决问题。
      

  7.   


    检查interrupt标志感觉和自定义标志位类似,同样需要定期的去检查这个标志位。目前的程序比较复杂,感觉上每执行一步就去判断interrupt状态不太现实。
      

  8.   


    检查interrupt标志感觉和自定义标志位类似,同样需要定期的去检查这个标志位。目前的程序比较复杂,感觉上每执行一步就去判断interrupt状态不太现实。你想要在不侵入线程本身逻辑的情况下让它随时可以结束么?
    如果你这样想,很明确的告诉你做不到。如果你是想要退出主程序,可以考虑把线程变成守护线程,让其不影响你主线程退出。
    或者可以考虑把线程升级为进程,这样你可以任意操作它的状态
      

  9.   


    检查interrupt标志感觉和自定义标志位类似,同样需要定期的去检查这个标志位。目前的程序比较复杂,感觉上每执行一步就去判断interrupt状态不太现实。你想要在不侵入线程本身逻辑的情况下让它随时可以结束么?
    如果你这样想,很明确的告诉你做不到。如果你是想要退出主程序,可以考虑把线程变成守护线程,让其不影响你主线程退出。
    或者可以考虑把线程升级为进程,这样你可以任意操作它的状态程序的入口是一个JavaFX的界面,点击一个按钮后会开始执行一个查询的线程。
    现在想达到的目的是,在界面上增加一个终止按钮,结束当前的查询,但影响我的界面线程。
      

  10.   


    检查interrupt标志感觉和自定义标志位类似,同样需要定期的去检查这个标志位。目前的程序比较复杂,感觉上每执行一步就去判断interrupt状态不太现实。你想要在不侵入线程本身逻辑的情况下让它随时可以结束么?
    如果你这样想,很明确的告诉你做不到。如果你是想要退出主程序,可以考虑把线程变成守护线程,让其不影响你主线程退出。
    或者可以考虑把线程升级为进程,这样你可以任意操作它的状态程序的入口是一个JavaFX的界面,点击一个按钮后会开始执行一个查询的线程。
    现在想达到的目的是,在界面上增加一个终止按钮,结束当前的查询,但影响我的界面线程。
    写错了,需要终止查询线程,但不影响我的界面线程。
      

  11.   


    检查interrupt标志感觉和自定义标志位类似,同样需要定期的去检查这个标志位。目前的程序比较复杂,感觉上每执行一步就去判断interrupt状态不太现实。你想要在不侵入线程本身逻辑的情况下让它随时可以结束么?
    如果你这样想,很明确的告诉你做不到。如果你是想要退出主程序,可以考虑把线程变成守护线程,让其不影响你主线程退出。
    或者可以考虑把线程升级为进程,这样你可以任意操作它的状态程序的入口是一个JavaFX的界面,点击一个按钮后会开始执行一个查询的线程。
    现在想达到的目的是,在界面上增加一个终止按钮,结束当前的查询,但影响我的界面线程。
    写错了,需要终止查询线程,但不影响我的界面线程。所以其实你的问题不在于你要终止查询,你的问题出在:
    你不该在一个客户端应用里,把一个长时间计算的操作放在主线程里。你应该把这个查询变成异步的,查完了通知主线程显示,如果主线程已经不想查了可以直接忽略查询结果。这样你的长时间计算的线程就不会阻塞你的主线程(让界面看起来像没响应一样),并且你也不需要去关系你的异步查询线程到底执行完了没有(用户不想看了直接抛弃这个线程让它慢慢跑就行了)。虽然还是会占用你的机器的计算资源,但是不影响你的程序。最好的做法还是在计算中去检测线程的interrupt标志。
      

  12.   


    检查interrupt标志感觉和自定义标志位类似,同样需要定期的去检查这个标志位。目前的程序比较复杂,感觉上每执行一步就去判断interrupt状态不太现实。你想要在不侵入线程本身逻辑的情况下让它随时可以结束么?
    如果你这样想,很明确的告诉你做不到。如果你是想要退出主程序,可以考虑把线程变成守护线程,让其不影响你主线程退出。
    或者可以考虑把线程升级为进程,这样你可以任意操作它的状态程序的入口是一个JavaFX的界面,点击一个按钮后会开始执行一个查询的线程。
    现在想达到的目的是,在界面上增加一个终止按钮,结束当前的查询,但影响我的界面线程。
    写错了,需要终止查询线程,但不影响我的界面线程。所以其实你的问题不在于你要终止查询,你的问题出在:
    你不该在一个客户端应用里,把一个长时间计算的操作放在主线程里。你应该把这个查询变成异步的,查完了通知主线程显示,如果主线程已经不想查了可以直接忽略查询结果。这样你的长时间计算的线程就不会阻塞你的主线程(让界面看起来像没响应一样),并且你也不需要去关系你的异步查询线程到底执行完了没有(用户不想看了直接抛弃这个线程让它慢慢跑就行了)。虽然还是会占用你的机器的计算资源,但是不影响你的程序。最好的做法还是在计算中去检测线程的interrupt标志。
    现在的查询不在主线程中,而是单独起的子线程,所以我的界面不会没响应。
    之所以说要终止查询,是因为我的操作时要登陆其他的设备进行操作的,我需要在保证在终止查询之后进行一些收尾操作。
    如果前端看起来已经终止了,我开始在界面中进行其他操作,而线程还在后台在不知道的时候操作设备,这样可能会造成更大的麻烦。