首页 > 其他分享 >(随笔)龟兔赛跑(多线程调用同一资源时一个线程结束时其他线程保持运行)

(随笔)龟兔赛跑(多线程调用同一资源时一个线程结束时其他线程保持运行)

时间:2023-08-16 18:56:29浏览次数:43  
标签:赛跑 结束 16 龟兔 线程 TextThread 多线程 public

问题:当其一线程结束运行后其他线程保持运行而非结束

现象:控制台会输出两次the winner is:xxx

代码如下

package com.demo01;

/**
 * TODO 模拟归途赛跑
 *
 * @author pangyangjian
 * @since 2023/8/16 16:10
 */
public class TextThread_5 implements Runnable {
	
	@Override
	public void run() {
		for (int i = 0; i <= 200; i++) {
			System.out.println(Thread.currentThread().getName() + "跑了" + i + "步");
			if(!gameOver(i)){
				break;
			}
		}
	}
	
	public boolean gameOver(int step) {
		if (step == 200) {
			System.out.println("the winner is:" + Thread.currentThread().getName());
			return false;
		}
		return true;
	}
	
	public static void main(String[] args) {
		TextThread_5 race = new TextThread_5();
		new Thread(race, "Rabbit").start();
		new Thread(race, "Turtle").start();
	}
}

回答:当一个线程结束后,另一个线程并不会立即结束的原因是,gameOver()方法返回true时,循环会继续执行。即使一个线程已经达到了step == 200的条件,另一个线程仍然可以继续打印输出。
解决方法:通过共享的标志变量来控制两个线程的结束。可以将标志变量放在TextThread_5类的成员变量中。

改进后代码如下

package com.demo01;

/**
 * TODO 模拟归途赛跑
 *
 * @author pangyangjian
 * @since 2023/8/16 16:10
 */
public class TextThread_5 implements Runnable {
	private volatile boolean gameOver = false;
	
	@Override
	public void run() {
		for (int i = 0; i <= 200; i++) {
			System.out.println(Thread.currentThread().getName() + "跑了" + i + "步");
			if (!gameOver(i)) {
				break;
			}
			if ("Rabbit".equals(Thread.currentThread().getName()) && i % 100 == 0) {
				try {
					Thread.sleep(1);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}
	
	public synchronized boolean gameOver(int step) {
		if (gameOver) {
			return false;
		}
		if (step >= 200) {
			System.out.println("the winner is:" + Thread.currentThread().getName());
			gameOver = true;
			return false;
		}
		return true;
	}
	
	public static void main(String[] args) {
		TextThread_5 race = new TextThread_5();
		new Thread(race, "Rabbit").start();
		new Thread(race, "Turtle").start();
	}
}

标签:赛跑,结束,16,龟兔,线程,TextThread,多线程,public
From: https://www.cnblogs.com/Joseph-Jonardo/p/17635940.html

相关文章

  • 多线程&异步编程
    多线程&网络编程(异步编程)1)重要性,高并发,短时间内遇到大量请求2)难度硬件.操作系统多线程本身的复杂性,死锁,资源抢占,线程同步...--->多线程进程:一般指程序中运行的程序,实际作用是为程序在执行过程中创建好所需要的环境和资源.线程:是进程的一个实体,是Cpu用来调度......
  • 多线程|线程的特性
      ......
  • 用 TaskCompletionSource 来做多线程间的数据同步
    publicabstractclassHunClientBase{protectedComunicationConfig_ComunicationConfig;protectedHubConnection_HubConnection;privateTaskCompletionSource<string>requestCompletionSource;protectedHunClientBas......
  • 虚拟线程简单用法
    以下包含AI创作ExecutorService用法try(varexecutor=Executors.newVirtualThreadPerTaskExecutor()){varfuture1=executor.submit(()->fetchURL(url1));varfuture2=executor.submit(()->fetchURL(url2));response.send(future1......
  • Java并发编程:实现高效、线程安全的多线程应用
    Java并发编程是开发高效、可扩展的多线程应用的关键。合理地利用多线程可以提高程序的性能和响应性,但同时也会引入线程安全的问题。本文将介绍Java并发编程的关键技巧,帮助读者实现高效、线程安全的多线程应用。 线程安全的数据结构和类Java提供了许多线程安全的数据结构和类,如Co......
  • 什么是多线程中的上下文切换
    多线程中的上下文切换(ContextSwitching)是指在多任务(多线程)环境下,操作系统将当前线程的状态保存(上下文信息,如寄存器内容、程序计数器等)并切换到另一个就绪状态的线程的过程。上下文切换是实现多任务并发的基本机制之一,它允许多个线程在一个物理CPU上交替执行,从而实现了多线程并......
  • 直播平台源码优质平台技术:并行处理与线程优化的探索与实践
     面对日益火爆的新型互联网社交形式,直播平台源码APP作为一种实时的多媒体传输和交互方式,越来越受到用户的欢迎,直播平台源码APP能够吸引来大量的用户,并越来越受欢迎,也依托直播平台源码APP的优质平台技术,其中,为了能在处理用户任务能够做到实时性与流畅性,并行处理与线程优化技术被......
  • 对线程池的理解
    线程池是一种并发编程的技术,它是管理和重用线程的一种机制,能够有效地提高多线程应用程序的性能和资源利用率。线程池维护一组可重用的线程,可以分配任务给这些线程来执行,从而避免了频繁地创建和销毁线程,减少了系统开销。以下是我对线程池的一些关键理解:线程池的组成:线程池由线......
  • java死锁、线程状态、线程通信、线程池
    1.回顾java实现多线程:[1]继承Thread类并重写run方法[2]实现Runnable接口线程Thread中常用的方法:setName():Thread.currentThread().getName():​staticvoidsleep();staticvoidyield():join():setDeamon()设置后台线程线程安全问题:---当......
  • Java并发编程:实现高效、线程安全的多线程应用
    Java并发编程是开发高效、可扩展的多线程应用的关键。合理地利用多线程可以提高程序的性能和响应性,但同时也会引入线程安全的问题。本文将介绍Java并发编程的关键技巧,帮助读者实现高效、线程安全的多线程应用。 线程安全的数据结构和类Java提供了许多线程安全的数据结构和类,如Co......