`

三个线程循环切换

 
阅读更多
package com.thread;

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class ThreadTest3 {
	public static void main(String[] args) {
		
		final Business business=new Business();

		
		//线程三
		new Thread(new Runnable() {
			public void run() {
				for (int i = 0; i < 5; i++) {
					try {
						business.sub3(i);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}).start();
		//线程二
		new Thread(new Runnable() {
			public void run() {
				for (int i = 0; i < 5; i++) {
					try {
						business.sub2(i);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
			}
		}).start();
		

		
		//main方法本身是个线程,即线程二运行代码直接放到main方法中
		for (int i = 0; i < 5; i++) {
			try {
				business.main(i);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
	
	
	static class Business{
		Lock lock=new ReentrantLock();
		Condition condition1=lock.newCondition();
		Condition condition2=lock.newCondition();
		Condition condition3=lock.newCondition();
		
		private int isSub=1;//当前运行的方法是main();
		
		//线程三
		public  void sub3(int i) throws InterruptedException {
			lock.lock();
			while (isSub!=3) {
				condition3.await();
			}
			for (int j = 0; j < 10; j++) {
				System.out.println("sub3 thread sequence is "+j+" and loop is "+i);
			}
			isSub = 1;
			condition1.signal();
			lock.unlock();
		}
		
		//线程二
		public  void sub2(int i) throws InterruptedException {
			lock.lock();
			while (isSub!=2) {
				condition2.await();
			}
			for (int j = 0; j < 10; j++) {
				System.out.println("sub2 thread sequence is "+j+" and loop is "+i);
			}
			isSub = 3;
			condition3.signal();
			lock.unlock();
		}
		
		//主线程,即main
		public  void main(int i) throws InterruptedException{
			lock.lock();
			while (isSub!=1) {
				condition1.await();
			}
			for (int j = 0; j < 10; j++) {
				System.out.println("main thread sequence is "+j+" and loop is "+i);
			}
			isSub = 2;
			condition2.signal();
			lock.unlock();
		}
	}

}



分享到:
评论

相关推荐

    MFC多线程编程实例三个

    总结,MFC多线程编程实例三个展示了如何利用MFC库创建和管理多个线程,特别是在Tab控件的环境中。每个实例都可能包含如何初始化线程、启动Dialog、传递参数以及处理线程同步的代码,这对于理解和实践MFC的多线程编程...

    线程的几个重要方法.doc

    当多个线程尝试访问同一共享资源时,`synchronized`可以确保同一时间只有一个线程能访问该资源,从而防止数据不一致。通过结合使用这些方法和关键字,开发者可以有效地控制线程的执行顺序,实现更复杂的并发控制策略...

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

    多线程是指在一个进程中可以同时执行多个独立的代码段,每个代码段被称为一个线程。这种设计允许程序在处理多个任务时更加灵活,提高资源利用率和系统响应速度。在Linux系统中,线程共享同一地址空间,这意味着它们...

    多线程面试题

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

    多线程编程指南

    - **2.2.3 使用NSObject来生成一个线程**:通过继承`NSObject`并重写`performSelector:onThread:withObject:waitUntilDone:`方法来间接创建线程。 - **2.2.4 使用其他线程技术**:如Grand Central Dispatch (GCD) 或...

    多线程教程+实例讲解

    1. 同步:为了避免多个线程对共享资源的竞态条件,需要进行线程同步,如Java中的synchronized关键字,Python的Lock对象。 2. 互斥量与信号量:互斥量用于保护临界区,一次只有一个线程能访问;信号量可控制多个线程...

    TCP server 多线程

    这种模型的优势在于,每个线程都可以独立地处理一个客户端连接,互不干扰,提升了服务的并行处理能力。但是,过多的线程也会带来问题,比如线程创建和销毁的开销、线程间的上下文切换成本,以及可能导致的资源竞争。...

    Linux下线程的创建

    2. **上下文切换快**:线程之间的上下文切换比进程间切换更快,因为它们共享相同的内存空间。 3. **通信简单**:线程之间可以直接访问同一进程的数据,无需额外的通信机制。 #### 二、线程的基本操作 在Linux中,...

    android 中定时器的3个实现方法(均测试通过)

    android 中定时器的3个实现方法(均测试通过) 一、采用Handler与线程的sleep(long)方法 二、采用Handler的postDelayed(Runnable, long)方法 三、采用Handler与timer及TimerTask结合的方法

    多线程】_认识多线程

    1. 线程:线程是操作系统分配处理器时间的基本单元,一个进程可以包含一个或多个线程。每个线程都有自己独立的执行路径,共享同一进程的内存空间和资源。 2. 进程:进程是操作系统中的一个实体,拥有独立的资源,如...

    多线程编程指南_学习多线程编程的宝典

    1. `std::thread_local`关键字:为每个线程创建单独的存储区域,即使多个线程访问同一变量,也能保证互不干扰。 2. 应用场景:如线程池中的线程ID存储,避免全局变量的并发问题。 五、线程安全的数据结构 1. C++...

    Java多线程编程经验

    每个线程都拥有自己的调用栈,这意味着每个线程都有独立的执行路径。线程之间可以共享进程级别的资源,例如内存,但不能直接访问对方的局部变量或调用栈上的数据。 #### 五、Java线程:线程状态的转换 线程的状态...

    java 程序多线程设计课件

    9. **线程优先级**:Java线程有三个优先级:`MIN_PRIORITY`, `NORM_PRIORITY`, `MAX_PRIORITY`,但优先级并不保证绝对的执行顺序,因为线程调度由JVM决定。 10. **守护线程(Daemon Thread)**:守护线程不会阻止...

    Java多线程编程模板

    1. synchronized关键字:可以修饰方法或代码块,保证同一时刻只有一个线程能执行。 2. volatile关键字:保证共享变量的可见性和禁止指令重排序,但不保证原子性。 3. Lock接口和ReentrantLock类:提供更细粒度的锁...

    java多线程学习资料

    一个进程中可以包含多个线程,这些线程共享相同的内存空间,能够并行执行。 - **多线程**: 指在一个程序中同时运行多个线程的能力。通过多线程,可以提高程序的执行效率和响应速度。 #### 三、多线程的基本原理 - *...

    专家级多线程技术

    1. 同步:防止多个线程同时访问临界资源,常见的同步机制包括互斥量(Mutex)、信号量(Semaphore)、条件变量(Condition Variable)等。 2. 通信:线程间传递数据的方式,如使用管道(Pipe)、消息队列(Message ...

    Java 语法总结——线程(线程)

    线程是程序执行的最小单元,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈,而它们共享同一块内存区域,如堆内存和方法区。这种设计使得多线程环境下的资源利用更为高效。 二、线程的创建 1. 实现Runnable...

Global site tag (gtag.js) - Google Analytics