1. 自己利用线程的第一种实现方式,实现如下功能(多线程引例):
a. 程序不停地在屏幕上输出一句问候的语句(比如“你好”) (时间间隔一定要大些比如3s(或大于3s),因为在控制台窗口,输入和输出不能同时发生, 我们只能在两次输出“你好”的间隙,从键盘输入数据,才能保证键盘输入被正确接收)
b.同时,当我通过键盘输入固定响应的时候,程序停止向屏幕输出问候的语句
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class day2301 {
//创建控制输出的标志
static boolean flag = true;
public static void main(String[] args) {
//创建Print子类对象并运行
Print print = new Print();
print.start();
//创建Exit子类对象并运行(输入在洗澡后停止)
Exit exit = new Exit();
exit.start();
System.out.println("main end");
}
//创建一个输出"你好啊"的线程
static class Print extends Thread {
@Override
public void run() {
try {
while (flag) {
sleep(3000);
System.out.println("你好啊");
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
//创建停止进程
static class Exit extends Thread {
@Override
public void run() {
//键盘录入数据
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String data = null;
try {
data = br.readLine();
while (true) {
if ("在洗澡".equals(data)) {
flag = false;
break;
}
}
//释放资源
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
思路:
创建两个线程(输入和停止),并定义控制输出的标志flag;
Print线程一直循环输出"你好啊";
Exit线程当输出"在洗澡"时将标志flag变为false阻止Print的输出.
最后创建两个子类对象并运行.
2.阅读如下代码: 1. 回答输出的是什么内容 2. 为什么?
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Runnable匿名子类的run方法");
}
}) {
@Override
public void run() {
System.out.println("Thread匿名子类的run方法");
}
}.start();
答:
1.输出的是Thread匿名子类的run方法;
2.
a.首先创建了一个Thread的匿名内部类对象
b.在该Thread子类对象接收一个Runnable接口子类的匿名内部类对象
c.在其子类对象上覆盖了父类的run方法
d.在Thread的匿名内部类对象上调用了start()方法,
启动该Thread匿名内部类对象所表示的子线程
此时,调用的run方法为覆盖后的子方法,故输出的是"Thread匿名子类的run方法"(多态效果).