初学JAVA,在做一个线程的练习
是有2个按钮,一个开始,一个结束,然后按下开始后读入文件,按下结束,停止读入
第一次按开始是没有问题,开始读入,然后按结束停止
但是照理说,第二次再按下开始,应该重新读入并输出到控制台中,但是输出一片空白,确实有在读入,因为滚动条是在动的,但是却什么都没有显示,请教下这是为什么?代码如下:
package java18;import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;public class Ex02 extends JFrame {
private static final long serialVersionUID = 20101019L;
private int screenWidth = Toolkit.getDefaultToolkit().getScreenSize().width;
private int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height;
private Thread thread = null;
private File word = new File("E:/00works/CODE/JAVA/[EX]/file", "word.txt");
private int i = 0;
private int length;
private JPanel pane = null;
private JButton start = null;
private JButton finish = null; public Ex02() {
init();
} private void init() {
Container container = this.getContentPane();
this.setTitle("线程练习");
container.setLayout(null);
this.setSize(180, 100);
this.setLocation((screenWidth - 180) / 2, (screenHeight - 100) / 2);
this.setVisible(true);
container.add(getPane());
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
} private JPanel getPane() {
if (pane == null) {
pane = new JPanel(new FlowLayout());
pane.setBounds(0, 15, 180, 70);
pane.add(getStart());
pane.add(getFinish());
}
return pane;
} private JButton getStart() {
if (start == null) {
start = new JButton("开始");
start.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg) {
if (thread==null) {
print();
thread.start();
}
}
});
}
return start;
} private void print() {
thread = new Thread(new Runnable() {
public void run() {
try {
FileReader readWord = new FileReader(word);
char[] ch = new char[1024];
length = readWord.read(ch);
while (true) {
System.out.print(ch[i]);
i++;
Thread.sleep(100);
if (i == length) {
break;
}
}
readWord.close();
} catch (Exception err) {
err.printStackTrace();
}
}
});
} private JButton getFinish() {
if (finish == null) {
finish = new JButton("结束");
finish.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg) {
i = length;
thread = null;
}
});
}
return finish;
} public static void main(String[] args) {
new Ex02();
}
}

解决方案 »

  1.   


    import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;public class Ex02 extends JFrame {
    private static final long serialVersionUID = 20101019L;
    private int screenWidth = Toolkit.getDefaultToolkit().getScreenSize().width;
    private int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height;
    private Thread thread = null;
    private File word = new File("E:/00works/CODE/JAVA/[EX]/file", "word.txt");
    private int i = 0;
    private int length;
    private JPanel pane = null;
    private JButton start = null;
    private JButton finish = null; public Ex02() {
    init();
    } private void init() {
    Container container = this.getContentPane();
    this.setTitle("线程练习");
    container.setLayout(null);
    this.setSize(180, 100);
    this.setLocation((screenWidth - 180) / 2, (screenHeight - 100) / 2);
    this.setVisible(true);
    container.add(getPane());
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    } private JPanel getPane() {
    if (pane == null) {
    pane = new JPanel(new FlowLayout());
    pane.setBounds(0, 15, 180, 70);
    pane.add(getStart());
    pane.add(getFinish());
    }
    return pane;
    } private JButton getStart() {
    if (start == null) {
    start = new JButton("开始");
    start.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg) {
    if (thread==null) {
    print();
    thread.start();
    }
    }
    });
    }
    return start;
    } private void print() {
    thread = new Thread(new Runnable() {
    public void run() {
    try {
    FileReader readWord = new FileReader(word);
    char[] ch = new char[1024];
    length = readWord.read(ch);
    while (true) {
    System.out.print(ch[i]);
    i++;
    Thread.sleep(100);
    if (i == length) {
    break;
    }
    }
    readWord.close();
    } catch (Exception err) {
    err.printStackTrace();
    }
    }
    });
    } private JButton getFinish() {
    if (finish == null) {
    finish = new JButton("结束");
    finish.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg) {
    i = length;
    thread = null;
    }
    });
    }
    return finish;
    } public static void main(String[] args) {
    new Ex02();
    }
    }
      

  2.   

    你在print方法里打印下i的值,第二次i的值已经指向文件的尾了,所以没值输出。
    你可以定义一个变量来纪录点击stop的时候的位置,下次再点击start的时候,从这里读取,相当()的用法。
      

  3.   

    哦哦,可以了,非常感谢~~~~~> <我修改了一下,stop里面也加了个线程,一开始我想用sleep来等待线程的跳出,但是觉得sleep还是不太可靠,虽然在这个简单的线程里面用sleep是没什么问题,但是复杂一点的,很难保证能够在规定时间内跳出线程,所以还是改成wait和notify了具体修改加了2个变量
    private int stop;
    private int length;
    private Object lock = new Object();
    private JPanel pane = null;
    private JButton startButton = null;
    private JButton stopButton = null;
    然后修改了print方法,和暂停按钮,加了个暂停的线程
    使用了一下wait和notify方法,确保按下暂停按钮跳出前面那个线程后再把stop的值赋给i
    private void print() {
    printThread = new Thread(new Runnable() {
    public void run() {
    try {
    FileReader readWord = new FileReader(word);
    char[] ch = new char[1024];
    length = readWord.read(ch);
    while (true) {
    System.out.print(ch[i]);
    i++;
    Thread.sleep(100);
    if (i == length) {
    break;
    }
    }
    readWord.close();
    synchronized (lock) {
    lock.notify();
    }
    } catch (Exception err) {
    err.printStackTrace();
    }
    }
    });
    } private JButton getStopButton() {
    if (stopButton == null) {
    stopButton = new JButton("暂停");
    stopButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg) {
    stopPrint();
    stopThread.start();
    }
    });
    }
    return stopButton;
    } private void stopPrint() {
    stopThread = new Thread(new Runnable() {
    public void run() {
    stop = i;
    i = length;
    synchronized (lock) {
    try {
    lock.wait();
    } catch (Exception err) {
    err.printStackTrace();
    }
    }
    printThread = null;
    i = stop;
    }
    });
    }