一个线程里有一个BufferedReader正在等待read,此时要结束这个线程怎么做?我试过直接stop,destroy,都不行...也试过BufferedReader的close方法也不行..高手指教

解决方案 »

  1.   

    stop怎么不行?线程立即死亡并释放所有资源还不够你用的阿
      

  2.   

    我是run里有个read的函数..然后还有个函数A,A的内容是this.stop..我在启动线程之后,外部调用函数A结束线程,用stop不行..
      

  3.   

    我在启动线程之后,外部调用函数A结束线程,用stop不行..这个STOP 是外面得STOP了
      

  4.   

    我再函数A里写得是this.stop,应该就是线程本身的stop吧
      

  5.   

    代码太长了..我截取了有用的部分public class FTPThread extends Thread{
     
    private BufferedReader in_log = null;
            private boolean Login=false;        public void login(){
                    ....
             out_log.print("(用户名:密码):");
    String[] tmp = in_log.readLine().trim().split(":");
                    .....
            }
            public void run(){
            ....
               login();
            ...        
            }
    public void stopTransfer() {
    if (!Login) {
    this.stop();
    }
    }
    }in_log和out_log封装的是一个console的inputStream和outputStream外部程序启动这个线程,然后在做了一系列操作之后再调用stopTransfer()
      

  6.   

    stopTransfer()这个函数在哪里调用的?
      

  7.   

    楼上的几位不要把wait和stop搞混了.wait是作用在访问这个对象的现成上的,stop是直接作用在现成上的.
    www.blogjava.net/huabingl
      

  8.   

    Maybe you can return directly in the stopTranfer() called in run(). Or maybe you can try the Runtime.exit()  method, I'm not sure, just for reference. 
      

  9.   

    我是用eclipse编译的
    在debug模式下,程序调用stopTransfer的时候,程序会在readLine的地方停止,线程并没有推出
    在run模式下,程序不会停止,但是线程还是没有退出..不知道为什么?怎样才能让这个线程退出?
      

  10.   

    to bitspx:我的程序的意图就是想在readLine等待的时候结束这个线程,所以stopTransfer()要外部调用...
    Runtime.exit不是用来结束线程的吧..
      

  11.   

    stop 并没有被JDK真正实现过, 因此调用stop 并不会 停止线程
      

  12.   

    stop 并没有被JDK真正实现过, 因此调用stop 并不会 停止线程不是吧,只是因为可能会引起死锁所以才不建议使用了而已
    不知道楼上的说法哪里看到的?楼主,stopTransfer()这个函数在哪里调用的?
      

  13.   

    to yingge:这个程序是一个含有界面程序的一部分..大概意思就是一个ftp线程正在等待用户输入用户名密码,但是此时需要结束这个线程,界面上的一个按钮调用stopTransfer()的不知道我有没有说得清楚...
      

  14.   

    说错了,是destroy() 没有被实现,可去看下jdk帮助文档里有说明。
    stop不好用,可以试试调用线程中的interrupt()方法来中断线程,或者直接关闭输入流
      

  15.   

    试了interrupt,也不行....
    我做了个简单的测试
    package com.test;import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;public class ThreadTest extends Thread{
    public BufferedReader br;
    public void run(){
    br=new BufferedReader(new InputStreamReader(System.in));
    String hello="";
    try {
    hello = br.readLine();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    String A=hello+hello;
    }
    }package com.test;import java.io.IOException;public class ThreadMain { /**
     * @param args
     */
    @SuppressWarnings("deprecation")
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    ThreadTest tt=new ThreadTest();
    tt.start();
    for(int i=0;i<10000000;i++);
    tt.interrupt();
    tt.suspend();
    tt.stop();
    }}
    发现即使这样,线程还是没有被销毁..
      

  16.   

    hello = br.readLine();
    我想关键在这里吧,此时内部线程的状态应该是wait();所以是你的设计思想有问题,当用户输入结束时,再来关闭线程,不就OK了
      

  17.   

    线程处于wait,join,sleep状态才能stop或interrupt吧,你的例子里没有任何迹象表明线程处于这三种状态的任意一种咧阿拉不知道你怎么能stop。
    路过,路过。
      

  18.   

    to shmiluwei  : 我其实就是想把这个线程在等待read的时候结束掉..如何做到呢?
      

  19.   

    我们用java解决实际问题。欢迎有经验的java程序员加入我们的讨论,因人数接近上限,初级人员暂时不能加入,请谅解。QQ 群:3001581
      

  20.   

    一个小代码描述lz的问题import java.io.*;
    import java.lang.*;public class JavaThread implements java.lang.Runnable{

    public DataInputStream m_dataInput;
    public JavaThread()
    {
    try
    {
    m_dataInput = new DataInputStream(new BufferedInputStream(new FileInputStream("a.txt")));
    }
    catch(Exception e)
    {

    }
    }
    public void run()
    {
    try{
    for(int i=0;i<10;i++)
    {
    System.out.print("In thread\t");
    Thread.sleep(1000);
    String sContent = m_dataInput.readLine();
    System.out.println(sContent);
    }
    }
    catch(java.lang.InterruptedException e)
    {

    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    for(int i=0;i<10;i++)
    {
    try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println("After stop");//即使stop已经调用,但是这里还会输出
    }
    }

    public void stop()
    {
    try {
    this.m_dataInput.close();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    }
    public static void main(String [] args)
    {
    JavaThread jt = new JavaThread();
    Thread t = new Thread(jt);
    t.start();
    try
    {
    Thread.sleep(5000);
    jt.stop();
    }
    catch(java.lang.InterruptedException e)
    {
    }
    }
    }
      

  21.   

    不好意思  
    忘记了一句t.stop();这样停止了
      

  22.   

    hehe,试了半天,还真是个不好解决的问题……先给楼主出个馊主意吧,用 tt.setDaemon(true); 这样,当主线程结束后,那个子线程不想结束也得结束了  :D另外,建议楼主去看看 java.nio,也许能有点帮助。
      

  23.   

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;class ThreadTest extends Thread{
    public BufferedReader br;
    public void run() {
    br=new BufferedReader(new InputStreamReader(System.in));
    String hello=""; try {
    hello = br.readLine();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    System.out.println("Your input: " + hello);
    }
    }public class B { /**
     * @param args
     */
    @SuppressWarnings("deprecation") public static void main(String[] args) {
    // TODO Auto-generated method stub
    ThreadTest tt=new ThreadTest();
    tt.start();
    tt.stop();
    }}
    不是正常退出了吗?
    即使是:
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;class ThreadTest extends Thread{
    public BufferedReader br;
    public void run() {
    br=new BufferedReader(new InputStreamReader(System.in));
    String hello=""; while(true) {
    try {
    hello = br.readLine();
    } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

    System.out.println("Your input: " + hello);
    } //System.out.println("Thread exit.");
    }
    }public class B { /**
     * @param args
     */
    @SuppressWarnings("deprecation") public static void main(String[] args) {
    // TODO Auto-generated method stub
    ThreadTest tt=new ThreadTest();
    tt.start();
    tt.stop();
    }}
    也是胜利退出!我记得前几天,碰到一个Socket的receive 到是真的结束不了,不过既然结束不了,就可以用其他方法实现啊!
    干吗非得用 stop() 况且可能你用其它方法实现不会比 stop()差.
      

  24.   

    楼上的,你 tt.start() 和 tt.stop() 两句连续执行,当然能胜利退出了。新创建的线程还没执行到 readLine() 那行呢。这个问题的关键就是 readLine() 是一种阻塞式的 IO,而在其阻塞期间,其所在的线程不能被停止。顺便提醒楼主,我看过了,java.nio 应该能解决问题。我只是看了文档,没写测试程序,所以,具体方法嘛,楼主自己研究吧  :)
      

  25.   

    用NIO做多路异步IO才是正道另外,用stop会被人耻笑的,哪怕你没搞出问题。
      

  26.   

    ...又NIO方面的介绍吗?从来没用过