线程问题,使用守护线程解决问题。

img


线程问题,使用守护线程解决问题。线程问题,使用守护线程解决问题。

img

img

img

以下是一个Java实现,使用了守护线程来实现线程1的停止。

import java.util.Random;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 创建一个随机数生成器
        Random random = new Random();

        // 创建一个线程,用于随机打印数字
        Thread thread1 = new Thread(() -> {
            while (!Thread.currentThread().isInterrupted()) {
                // 生成一个随机数字并打印
                int num = random.nextInt(100);
                System.out.println(num);

                // 等待一段时间再继续打印
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // 如果线程被中断,则退出循环
                    break;
                }
            }
        });

        // 将线程1设置为守护线程
        thread1.setDaemon(true);

        // 创建一个线程,用于接收控制台输入
        Thread thread2 = new Thread(() -> {
            Scanner scanner = new Scanner(System.in);
            while (true) {
                // 等待用户输入
                String input = scanner.nextLine();

                // 如果用户输入了“q”,则停止打印数字
                if (input.equals("q")) {
                    // 中断线程1
                    thread1.interrupt();
                    break;
                }
            }
        });

        // 启动两个线程
        thread1.start();
        thread2.start();
    }
}

在这个实现中,我们使用 Thread.currentThread().isInterrupted() 来检查线程1是否被中断,如果是,则退出循环。我们还将线程1设置为守护线程,这意味着当没有非守护线程在运行时,它会自动退出。这样,当用户输入“q”并停止线程2时,线程1也会自动退出。

【相关推荐】



  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7634432
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:什么是操作数,如何理解操作数,经常听到操作数,到底是什么意思。
  • 除此之外, 这篇博客: 【扫雷游戏】简单模拟实现讲解中的 ☁️3. 扫雷,何时结束,如何反馈。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    int Show(char mine[ROW][COL], int x, int y)
    {
    	return mine[x - 1][y - 1] +
    		   mine[x - 1][y] +
    		   mine[x - 1][y + 1] +
    		   mine[x + 1][y - 1] +
    		   mine[x + 1][y] +
    		   mine[x + 1][y + 1] +
    		   mine[x][y - 1] +
    		   mine[x][y + 1];
    }
    
    
    //扫雷
    void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS])
    {
    	int x, y;
    	int endcount = ROW * COL - Count; //非雷的个数,用于标记
    	int count = Count;//雷的个数
    
    	//程序结束有两种情况:
    	//1.被炸死
    	//2.非雷点全走过了,只剩下雷点,排雷成功
    	do
    	{
    		if (endcount == 0) //非雷点为0
    		{
    			printf("已无雷区\n");
    			break;
    		}
    		printf("请输入坐标:\n");
    		scanf("%d%d", &x, &y);
    		if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
    		{
    			{
    				if (mine[x][y] == '1')
    				{
    					printf("你被炸死了\n");
    					//展开整个图
    					PrintBoard(mine, ROW, COL);
    					break;
    				}
    				//否则提示该坐标周围有多少雷
    				else
    				{
    					int showcount = Show(mine, x, y);
    
    					show[x][y] = showcount + '0';//数字转字符
    					PrintBoard(show, ROW, COL);
    				}
    			}
    		}
    
    		else
    		{
    			printf("坐标错误,请重新输入");
    			continue;
    		}
    	} while (1);
    }
    

    解释一下Show函数:
    在ASCII表中,我们可以观察到,
    ‘0’-‘0’=0 ( 字符0-字符0等于 数字0 )
    而其他任意数字字符减去字符0可以得到该数,比如
    ‘5’-‘0’= 5
    在这里插入图片描述
    因此 Show函数将周围八个字符(不是0就是1)
    全加起来,再减去8个‘0’。就能得到一个数字,
    该数字就表明周围有几个1。


    这也就解释了为什么说用1和0表示雷和非雷方便。


    最后再解释一下这行代码:

    show[x][y] = showcount + '0';//数字转字符
    

    因为show数组保存的是字符,无法完全接收这个返回来的整型数字。

    字符数 - ‘0’ = 数字 ——> 字符数 = 数字 + ‘0’


    完整代码:

    game.h

    #define _CRT_SECURE_NO_WARNINGS
    
    #include<stdio.h>
    
    //实际游戏范围
    #define ROW 9  
    #define COL 9  
    
    
    //扩大的范围
    #define ROWS 11
    #define COLS 11
    
    #define Count 10; //雷的个数
    
    
    //初始化棋盘
    void InitBoard(char board[ROWS][COLS], int row, int col, char set);
    
    //打印棋盘
    void PrintBoard(char board[ROWS][COLS], int row, int col);
    
    //布置雷
    void SetMine(char mine[ROWS][COLS], int row, int col);
    
    //扫雷
    void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS]);
    
    

    game.c

    #define _CRT_SECURE_NO_WARNINGS
    #include"game.h"
    
    
    //初始化棋盘
    void InitBoard(char board[ROWS][COLS], int row, int col, char set)
    {
    	for (int i = 0; i < row; i++)
    	{
    		for (int j = 0; j < col; j++)
    		{
    			board[i][j] = set;
    		}
    	}
    }
    
    
    
    //打印棋盘
    void PrintBoard(char board[ROWS][COLS], int row, int col)
    {
    	for (int i = 0; i <= row; i++)
    	{
    		printf("%d ", i);
    	}
    	printf("\n");
    	for (int i = 1; i <= row; i++)
    	{
    		printf("%d ", i);
    		for (int j = 1; j <= col; j++)
    		{
    			printf("%c ", board[i][j]);
    		}
    		printf("\n");
    	}
    }
    
    //布置雷
    void SetMine(char mine[ROWS][COLS], int row, int col)
    {
    	int count = Count;
    	while (count)
    	{
    		int x = rand() % 9 + 1;
    		int y = rand() % 9 + 1;
    		if (mine[x][y] == '0')
    		{
    			mine[x][y] = '1';
    			count--;
    		}
    	}
    
    }
    
    int Show(char mine[ROWS][COLS], int x, int y)
    {
    	return	mine[x - 1][y - 1] +
    			mine[x - 1][y] +
    			mine[x - 1][y + 1] +
    			mine[x + 1][y - 1] +
    			mine[x + 1][y] +
    			mine[x + 1][y + 1] +
    			mine[x][y - 1] +
    			mine[x][y + 1] - 8 * '0';
    		
    }
    
    
    
    //扫雷
    void FindMine(char mine[ROWS][COLS], char show[ROWS][COLS])
    {
    	int x, y;
    	int endcount = ROW * COL - Count; //非雷的个数,用于标记
    	int count = Count;//雷的个数
    
    	//程序结束有两种情况:
    	//1.被炸死
    	//2.非雷点全走过了,只剩下雷点,排雷成功
    	do
    	{
    		if (endcount == 0) //非雷点为0
    		{
    			printf("已无雷区\n");
    			break;
    		}
    		printf("请输入坐标:\n");
    		scanf("%d%d", &x, &y);
    		if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
    		{
    			{
    				if (mine[x][y] == '1')
    				{
    					printf("你被炸死了\n");
    					//展开整个图
    					PrintBoard(mine, ROW, COL);
    					break;
    				}
    				//否则提示该坐标周围有多少雷
    				else
    				{
    					endcount--; //没找到一个非雷点,非雷数减一,当非雷数为0 ,说明排雷成功,游戏结束
    					int showcount = Show(mine, x, y);
    
    					show[x][y] = showcount + '0';
    					PrintBoard(show, ROW, COL);
    				}
    			}
    		}
    
    		else
    		{
    			printf("坐标错误,请重新输入");
    			continue;
    		}
    	} while (1);
    }
    
    
    
    

    test.c

    #define _CRT_SECURE_NO_WARNINGS
    
    #include"game.h"
    #include<time.h>
    
    
    void game()
    {
    	srand((unsigned int)time(NULL));
    
    	char mine[ROWS][COLS]; //雷盘
    	char show[ROWS][COLS];//反馈盘
    
    	//初始化棋盘
    	InitBoard(mine, ROWS, COLS, '0');  //0非雷 
    	InitBoard(show, ROWS, COLS, '*');
    	//布置雷
    	SetMine(mine, ROW, COL);
    	PrintBoard(show, ROW, COL);
    	//扫雷
    	int x, y;
    	FindMine(mine, show);
    
    
    }
    
    
    
    
    int main()
    {
    	game();
    }
    

    在这里插入图片描述


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^