• 启动两个线程,用另一个线程以通知的终止另一个线程


    要求:

    1. 在main方法中启动两个线程
    2. 第一个线程循环随机打印100以内的整数
    3. 直到第二个线程从键盘读取了”Q“命令

    实现代码如下:

    1. public class Homework01 {
    2. public static void main(String[] args) {
    3. THk tHk = new THk();
    4. tHk.start();
    5. Thk2 thk2 = new Thk2(tHk);
    6. thk2.start();
    7. }
    8. }
    9. //第一个线程循环打印1——100之间的数字
    10. class THk extends Thread {
    11. Random rm = new Random();
    12. boolean flag = true;
    13. public void setFlag(boolean flag) {
    14. this.flag = flag;
    15. }
    16. @Override
    17. public void run() {
    18. while (flag) {
    19. System.out.println((int) rm.nextInt(100) + 1);
    20. // System.out.println((int)rm.nextInt()*100+1);
    21. try {
    22. Thread.sleep(1000);
    23. } catch (InterruptedException e) {
    24. e.printStackTrace();
    25. }
    26. }
    27. System.out.println("Thk线程已经退出~");
    28. }
    29. }
    30. //直到第二个线程从键盘读取了“Q”命令
    31. class Thk2 extends Thread {
    32. Scanner scanner = new Scanner(System.in);
    33. private THk tHk;
    34. public Thk2(THk tHk) {
    35. this.tHk = tHk;
    36. }
    37. @Override
    38. public void run() {
    39. while (true) {
    40. //接受用户的输入
    41. System.out.println("请输入你的指令(Q)表示退出:");
    42. char key = scanner.next().toUpperCase().charAt(0);
    43. if (key == 'Q') {
    44. //已通知的方式结束a线程
    45. tHk.setFlag(false);
    46. System.out.println("Thk2退出~");
    47. break;
    48. }
    49. }
    50. }
    51. }
    1. public class Homework11 {
    2. public static void main(String[] args) {
    3. AA aa = new AA();
    4. BB bb = new BB(aa);
    5. aa.start();
    6. bb.start();
    7. }
    8. }
    9. class AA extends Thread {
    10. //该线程是实现不断打印100以内的整数
    11. Random rm = new Random();
    12. boolean flag = true;
    13. public void setFlag(){
    14. flag=false;
    15. }
    16. @Override
    17. public void run() {
    18. while (flag) {
    19. System.out.println((int)rm.nextInt(100)+1);
    20. try {
    21. Thread.sleep(1000);
    22. } catch (InterruptedException e) {
    23. e.printStackTrace();
    24. }
    25. }
    26. System.out.println("线程AA已经退出~");
    27. }
    28. }
    29. class BB extends Thread{
    30. //该线程是读取字符“Q”来终止线程AA
    31. Scanner sc = new Scanner(System.in);
    32. private AA aa;
    33. public BB(AA aa){
    34. this.aa=aa;
    35. }
    36. @Override
    37. public void run(){
    38. while(true){
    39. System.out.println("请输入字符“Q”来退出程序:");
    40. char key = sc.next().toUpperCase().charAt(0);
    41. if(key=='Q'){
    42. aa.setFlag();
    43. }
    44. System.out.println("线程BB已经退出~");
    45. }
    46. }
    47. }

    注意:在控制台输入字符的时候,需要按两次回车键,不然系统识别不到,还在一边继续等待输入,一边继续输出~ 

  • 相关阅读:
    【数据结构算法】动态规划之【单序列问题】
    45从零开始用Rust编写nginx,静态文件服务器竟然还有这些细节
    MySQL报错 table “xxx” doesn‘t exit
    玩转Redhat Linux 8.0【小测验2】有答案!
    每周一算法:最短路计数
    AIGC实战——GPT(Generative Pre-trained Transformer)
    [软件工程] UML 用例图详解
    揭开堆叠式自动编码器的强大功能
    Apache Spark 在爱奇艺的应用实践
    Linux登录自动执行脚本
  • 原文地址:https://blog.csdn.net/qq_58341172/article/details/134038892