`

两个线程循环切换

 
阅读更多
package com.thread;

/**
 * 创建两个线程,一个线程循环10次,另一个线程100次,两者交替运行50次
 * 即到A线程时,它运行本身循环的10次之后;马上轮到B线程,它则运行本身的100次循环
 * 以此轮换切换线程共50次
 */
public class ThreadTest {
	public static void main(String[] args) {
		
		final Business business=new Business();

		
		//子线程
		new Thread(new Runnable() {
			public void run() {
				for (int i = 0; i < 50; i++) {
					try {
						business.sub(i);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}).start();
		
//----------------------------线程二-------------------------------------------------
		
		//main方法本身是个线程,即线程二运行代码直接放到main方法中
		for (int i = 0; i < 50; i++) {
			try {
				business.main(i);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
}

class Business{
	private boolean isSub=true;//当前运行的方法是sub()
	
	//线程一
	public synchronized void sub(int i) throws InterruptedException {
		while (!isSub) {
			this.wait();
		}
		for (int j = 0; j < 10; j++) {
			System.out.println("sub thread sequence is "+j+" and loop is "+i);
		}
		isSub = false;
		this.notify();
	}
	
	//主线程,即main
	public synchronized void main(int i) throws InterruptedException{
		while (isSub) {
			this.wait();
		}
		for (int j = 0; j < 100; j++) {
			System.out.println("main thread sequence is "+j+" and loop is "+i);
		}
		isSub = true;
		this.notify();
	}
}


分享到:
评论

相关推荐

    iOS-常驻线程之线程循环调用(两个线程循环交替调用)

    本话题主要探讨如何实现两个线程循环交替调用的机制,这通常是为了平衡负载或者实现特定的并发模式。例如,一个线程负责下载数据,另一个线程负责处理数据,两者交替工作,确保系统的高效运行。 首先,我们需要了解...

    线程死锁的例子

    例如,两个线程不能同时写入同一文件。 2. 请求与保持:一个线程已经持有至少一个资源,同时请求其他资源,但无法获取,因此陷入等待状态。 3. 不剥夺:线程已获得的资源在未释放之前不能被其他线程强行夺走,只能由...

    单线程与多线程的区别

    而对于I/O密集型任务,使用异步编程或者事件驱动模型(如Node.js中的事件循环)可能更为合适,因为它们可以避免不必要的线程切换开销。 在Java或C#这样的多线程环境下,可以使用如`Thread`类或`ThreadPool`来创建和...

    利用单线程完成的生产者与消费者程序

    在多线程环境下,生产者和消费者是两个不同的线程,它们共享一个缓冲区来存储数据。生产者将数据放入缓冲区,而消费者从缓冲区取出数据。为了确保线程安全,通常需要使用锁或信号量等同步机制来避免数据竞争。 然而...

    用 setjmp 和 longjmp 实现多线程(1)_多线程_

    在C语言中,setjmp和longjmp是两个与异常处理和非局部跳转相关的函数,它们可以被用来实现一种特殊的多线程效果。虽然这两个函数并非设计为创建和管理线程的标准方法,但在某些特定场景下,它们可以模拟多线程的行为...

    java多线程教程——一个课件彻底搞清多线程

    死锁是多线程编程中可能出现的问题,当两个或多个线程互相等待对方释放资源,形成循环等待,导致都无法继续执行,就出现了死锁。避免死锁的关键在于正确设计资源获取顺序和避免持有资源请求新资源。 Java的线程调度...

    线程基本知识(英文)

    举个例子,假设你在应用中创建了5个线程,每个线程都能在获得时间片时说出自己的线程编号。在这种情况下,你可能会听到扬声器中不断传出当前线程的编号。关键点在于,我们能区分出从扬声器中发出的不同编号,这表明...

    Linux系统下的多线程编程入门.pdf

    死锁是两个或更多线程互相等待对方释放资源,导致它们都无法继续执行。避免死锁的方法包括避免循环等待、设置超时和死锁预防/检测算法。 饥饿是指线程因其他高优先级线程持续占用资源而无法获取资源的情况。合理的...

    彻底明白Java的多线程-线程间的通信.doc

    因此,尽管两个线程都在运行,但它们都在同一个CPU核心上交替执行,导致看似只有一个线程在工作。为了实现真正的并发,我们需要使用更复杂的同步机制,如线程同步或线程间通信。 接着,我们来看如何在Java中实现多...

    多线程控制红绿灯变化

    这两个线程将循环检查当前状态并根据需要调用`wait()`和`notify()`方法来切换状态。同时,定时器会定期触发,以确保线程在适当的时间唤醒并检查状态。 在测试和调试阶段,使用日志或可视化工具可以帮助确认线程的...

    单线程实现同时监听多个端口(windows平台c++代码)

    5. **GetQueuedCompletionStatus**:在单线程中循环调用这个函数,获取IOCP中的完成状态,处理来自不同套接字的事件。这一步通常伴随着一个循环,直到没有更多完成的I/O操作。 6. **OVERLAPPED结构体**:在异步I/O...

    多线程处理数据(工具)样例

    5. **死锁**:当两个或更多线程相互等待对方释放资源而形成循环等待时,会发生死锁。设计时应避免出现可能导致死锁的条件。 6. **异常处理**:多线程环境下,异常处理尤为重要,因为一个线程中的异常可能会影响其他...

    一个线程 2个任务同时执行

    标题 "一个线程 2个任务同时执行" 暗示了我们正在讨论多任务处理的概念,特别是如何在一个单线程环境中实现同时执行两个或更多任务。在IT领域,这通常涉及到并发编程和线程管理。 并发编程是现代计算机系统中的核心...

    多线程面试题

    当一个线程想要获取自旋锁,但是锁已经被其他线程占用时,这个线程会不断循环检查锁是否可用,而不立即进入等待状态。这种机制适用于锁占用时间很短的情况。然而,如果锁持有时间过长,那么自旋就会消耗大量的CPU...

    Gallery和imageSwitcher循环显示切换图像组件

    这里,我们将深入探讨这两个组件的使用方法及其背后的原理。 首先,`Gallery`组件是Android提供的一种水平滚动的视图容器,类似于一个水平版的`ListView`。它可以用来展示一系列的项目,每个项目通常包含一张图片。...

    操作系统多线程的创建

    9. **死锁**:当两个或多个线程互相等待对方释放资源,导致无法继续执行的情况称为死锁。避免死锁通常需要遵循一些原则,如避免循环等待、设置超时、优先级继承等。 10. **性能考虑**:创建和销毁线程有一定的开销...

    C++多线程demo

    当两个或更多线程互相等待对方释放资源时,就会发生死锁。避免死锁的关键是遵循一些原则,如避免循环等待,使用超时和死锁预防算法等。 8. **线程安全**: 如果一个函数在多线程环境下正确工作,我们就说它是线程...

    多线程教程+实例讲解

    1. 死锁:两个或多个线程相互等待对方释放资源,导致无法继续执行的情况。 2. 死锁条件:互斥、占有并等待、无剥夺、循环等待,避免死锁要尽量打破这些条件。 3. 死锁预防与避免策略:银行家算法、资源预分配、超时...

    多线程编程(电子书)阅读

    3. **死锁**:当两个或多个线程相互等待对方释放资源而形成僵局时,就会发生死锁。避免死锁的关键是遵循正确的资源分配策略,如避免循环等待和设置超时限制。 4. **线程安全**:线程安全的代码是指在多线程环境中,...

Global site tag (gtag.js) - Google Analytics