初学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();
}
}
是有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();
}
}
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();
}
}
你可以定义一个变量来纪录点击stop的时候的位置,下次再点击start的时候,从这里读取,相当()的用法。
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;
}
});
}