经过多次查找方法和分析问题总算是解决了我自己作死的问题。继上次总结添加一些新的问题和解决方法。
1.创建一个新的线程有很多方法,目前我只弄懂了继承Thread类并在外部使用下面的start()但是这种方法在书上点名没有推荐,目测是因为这种方法会增加编译后字节码的冗余性。比较大的一个问题是如何停止一个线程,网上多次搜索,这好像一个世纪难题一样因为很多很多很多人在问这个问题而且关于这个问题的博文也很不少(遗憾的是没几篇是我能看懂的)。以前在Thread类下有一个stop(),可以很容易的从外部直接关闭这个线程,但这东西在java1.5中被删掉了,理由是不安全,不少程序员应该是不太想让自己写的线程的死亡时间决定在cpu手里的,要是线程结束的时候正好是保存数据的前一刻那各位用户就都可以去体验人生的第一次也是最后一个飞翔了........Sun推荐的取代方法也是我采取的方法是:在run()中使用一个while(boolean)将所有内容包括起来,并在外部使用其判断条件来决定何时退出该线程,具体事例如下:
public class Test{
Public static void main(String[] args){
testThread test = new testThread();
Test.start(); //开始线程
Test.cheak = false; //此处退出循环
}
}
class testThread extends Thread{
public boolean cheak = ture;
void run (){
While(cheak){
statments;
}
}
}
需要注意的是我在一开始犯了一个错误,在run()下又新建了一个testThread对象并使用了其中的cheak值,而这样的话会导致外部的对象和run()下的对象成为两个部分,并不相同,所以外部的test.cheak = false;将不再产生作用。
2.在我预想的实现中应该是程序一刻不停的打印表格直到输入任意键停止,但我在java中并没有找到类似C中getchar()的方法,在网上也没有找到“输入任意键继续”的实现方法,无奈只能退而求其次,使用sleep()使程序每打印一次表格暂停0.5s,使用户获得输入任意信息并回车的时间,不得不说这离我的预期差了很远,是个很遗憾的地方。
3.由于上面sleep()的使用,引入了另一个不知道什么玩意的东西:catch (InterruptedException e) {return; 这东西必须跟在sleep()的后面,让我一阵纠结,好像是用来捕捉程序的运行错误并强制停止该线程的,但我特么在用一个方法的时候已经被“强制”附上这个玩意了好么?
4.一个很蠢很蠢的问题终于得到了解决:如何调用同一个类下的另一个方法(请不要笑我),
原来在方法下是可以创建一个自己类的对象的(请不要笑我),时隔两周我特么终于找到了如何在main()下调用其他主类的方法了(请不要笑我),喜极而泣(请不要笑我)。。。。。。
下面附上我的作死成果:
import java.util.Scanner;
public class MultiyList{
void Tips (){
System.out.println("Here's some surprise in this program.Are you ready?");
System.out.println("You can press 1 to see the normal program,");
System.out.println("You can also press 2 to see the crazy program.");
System.out.println("If you want to stop,press any key then enter to stop.");
}
int Start (){
Scanner scanner = new Scanner(System.in);
int StartSignal = scanner.nextInt();
while (StartSignal != 1 && StartSignal != 2){
System.out.println("Error input.Please enter '1' or '2'.");
StartSignal = scanner.nextInt();
}
return StartSignal;
}
static public void main(String[] args){
Scanner scanner = new Scanner(System.in);
MultiyList support = new MultiyList();
support.Tips();
int StartSignal = support.Start();
if (StartSignal == 1){
for (int number2 = 1; number2 <= 9; number2++){
for (int number1 = 1; number1 <= 9; number1++){
if (number1 > number2){System.out.println();break;}
else
System.out.print(number1+"*"+number2+"="+(number1*number2)+"\t");
}
}
}
else{
Crazy crazy = new Crazy();
crazy.start();
String str = scanner.next();
crazy.exit = false;
}
System.out.println("\nDone");
}
}
class Crazy extends Thread{
public boolean exit = true;
public void run(){
while (exit){
for (int number2 = 1; number2 <= 9; number2++){
for (int number1 = 1; number1 <= 9; number1++){
if (number1 > number2){System.out.println();break;}
else
System.out.print(number1+"*"+number2+"="+(number1*number2)+"\t");
}
}
try {
sleep(500);
}catch (InterruptedException e) {
return;
}
}
}
}
总的来说还是有很多不如意的地方,比如选择模式的时候其实可以使用单词来进行交互,并使用类似C中touper()或tolower()来提高检测输入的容错率。还有就是没能找到让程序输入任意键停止的方法,不知道java中到底有没有这样的实现方法。
不过不管怎么样,本次作业已经作死完成,以后为了腾出更多时间给其他科目我应该不会像这样做大死了,。