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库创建和管理多个线程,特别是在Tab控件的环境中。每个实例都可能包含如何初始化线程、启动Dialog、传递参数以及处理线程同步的代码,这对于理解和实践MFC的多线程编程...
当多个线程尝试访问同一共享资源时,`synchronized`可以确保同一时间只有一个线程能访问该资源,从而防止数据不一致。通过结合使用这些方法和关键字,开发者可以有效地控制线程的执行顺序,实现更复杂的并发控制策略...
多线程是指在一个进程中可以同时执行多个独立的代码段,每个代码段被称为一个线程。这种设计允许程序在处理多个任务时更加灵活,提高资源利用率和系统响应速度。在Linux系统中,线程共享同一地址空间,这意味着它们...
当一个线程想要获取自旋锁,但是锁已经被其他线程占用时,这个线程会不断循环检查锁是否可用,而不立即进入等待状态。这种机制适用于锁占用时间很短的情况。然而,如果锁持有时间过长,那么自旋就会消耗大量的CPU...
- **2.2.3 使用NSObject来生成一个线程**:通过继承`NSObject`并重写`performSelector:onThread:withObject:waitUntilDone:`方法来间接创建线程。 - **2.2.4 使用其他线程技术**:如Grand Central Dispatch (GCD) 或...
1. 同步:为了避免多个线程对共享资源的竞态条件,需要进行线程同步,如Java中的synchronized关键字,Python的Lock对象。 2. 互斥量与信号量:互斥量用于保护临界区,一次只有一个线程能访问;信号量可控制多个线程...
这种模型的优势在于,每个线程都可以独立地处理一个客户端连接,互不干扰,提升了服务的并行处理能力。但是,过多的线程也会带来问题,比如线程创建和销毁的开销、线程间的上下文切换成本,以及可能导致的资源竞争。...
2. **上下文切换快**:线程之间的上下文切换比进程间切换更快,因为它们共享相同的内存空间。 3. **通信简单**:线程之间可以直接访问同一进程的数据,无需额外的通信机制。 #### 二、线程的基本操作 在Linux中,...
android 中定时器的3个实现方法(均测试通过) 一、采用Handler与线程的sleep(long)方法 二、采用Handler的postDelayed(Runnable, long)方法 三、采用Handler与timer及TimerTask结合的方法
1. 线程:线程是操作系统分配处理器时间的基本单元,一个进程可以包含一个或多个线程。每个线程都有自己独立的执行路径,共享同一进程的内存空间和资源。 2. 进程:进程是操作系统中的一个实体,拥有独立的资源,如...
1. `std::thread_local`关键字:为每个线程创建单独的存储区域,即使多个线程访问同一变量,也能保证互不干扰。 2. 应用场景:如线程池中的线程ID存储,避免全局变量的并发问题。 五、线程安全的数据结构 1. C++...
每个线程都拥有自己的调用栈,这意味着每个线程都有独立的执行路径。线程之间可以共享进程级别的资源,例如内存,但不能直接访问对方的局部变量或调用栈上的数据。 #### 五、Java线程:线程状态的转换 线程的状态...
9. **线程优先级**:Java线程有三个优先级:`MIN_PRIORITY`, `NORM_PRIORITY`, `MAX_PRIORITY`,但优先级并不保证绝对的执行顺序,因为线程调度由JVM决定。 10. **守护线程(Daemon Thread)**:守护线程不会阻止...
1. synchronized关键字:可以修饰方法或代码块,保证同一时刻只有一个线程能执行。 2. volatile关键字:保证共享变量的可见性和禁止指令重排序,但不保证原子性。 3. Lock接口和ReentrantLock类:提供更细粒度的锁...
一个进程中可以包含多个线程,这些线程共享相同的内存空间,能够并行执行。 - **多线程**: 指在一个程序中同时运行多个线程的能力。通过多线程,可以提高程序的执行效率和响应速度。 #### 三、多线程的基本原理 - *...
1. 同步:防止多个线程同时访问临界资源,常见的同步机制包括互斥量(Mutex)、信号量(Semaphore)、条件变量(Condition Variable)等。 2. 通信:线程间传递数据的方式,如使用管道(Pipe)、消息队列(Message ...
线程是程序执行的最小单元,每个线程都有自己的程序计数器、虚拟机栈、本地方法栈,而它们共享同一块内存区域,如堆内存和方法区。这种设计使得多线程环境下的资源利用更为高效。 二、线程的创建 1. 实现Runnable...