Day23 线程01-Thread实现的第一种方式

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方法"(多态效果).

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值