package com.mhm.test1; /** * 子线程跑10次,主线程跑5次,然后子线程再跑10次,主线程再跑5次,往返3次 * @author Mahone * */ public class Test2 { public static void main(String[] args) { Test2 t2 = new Test2(); t2.init(); } private void init() { final Business b = new Business(); Thread t = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i <3; i++) { b.sub(i); } } }); t.start(); for (int i = 0; i <3; i++) { b.main(i); } } /** * 业务类 * @author Administrator * */ class Business { // 默认subFlag为true,子线程可执行 private boolean subFlag = true; public synchronized void sub(int loop) { // 如果子线程不可执行,则当前线程等待,CPU给其他线程使用 if (!subFlag) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } for (int i = 0; i < 10; i++) { System.out.println("loop: " + loop + " sub-" + Thread.currentThread().getName()); } // 执行完子线程,子线程flag设为false subFlag = false; // 通知其他线程开始响应 this.notify(); } public synchronized void main (int loop) { if (subFlag) { try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } for (int i = 0; i < 5; i++) { System.out.println("loop: " + loop + " main-" + Thread.currentThread().getName()); } subFlag = true; this.notify(); } } }
相关推荐
在本实验中,通过创建一个主线程和一个子线程,要求子线程先执行,然后唤醒主线程。这一过程是通过信号量(Semaphore)这一同步机制来实现的。 1. 创建线程:在实验中,使用`CreateThread()`函数创建了一个子线程,...
即使子线程先执行完毕,但未被`join`之前,它仍处于"joinable"状态,等待父线程回收。一旦`join`,子线程的资源会被释放,其返回值(如果有)可以被主线程获取。 Perl线程的状态包括:创建(create)、运行...
假设我们有两个线程,子线程先执行10次,然后主线程执行5次,然后再切换到子线程执行10次,然后主线程执行5次,如此往返执行50次。 首先,我们需要创建两个线程,分别是主线程和子线程。每个线程中都需要一个50次的...
- E: 正确,子线程先执行并抛出异常,然后主线程继续执行并打印“run.”和异常信息,最后打印“Endofmethod.”。 **答案**: DE #### 例题二: 死锁理解 **题目描述**: 关于死锁的理解,下列哪些陈述是正确的? **...
在子线程中,需要使用信号量对象来控制访问,确保子线程先执行完毕,然后唤醒主线程。 知识点四:实验要求 在本实验中,学生需要正确理解和使用等待对象、信号量对象等系统调用,以解决实际问题。同时,学生也需要...
- `join()`方法用于等待线程完成,通常在主线程中调用,确保子线程先执行完毕。 - `wait()`让当前线程进入等待状态,直到被`notify()`或`notifyAll()`唤醒。 - `notify()`和`notifyAll()`用来唤醒一个或所有等待特定...
在子线程`child`中,`sleep(1)`确保子线程先执行,然后通过`sem_post(&s)`释放信号量,表明子线程已完成。在父线程`main`中,`sem_wait(&s)`使得父线程等待直到信号量可用(即子线程释放了信号量),然后父线程可以...