package com.czbk.thread; /** * Created by chengtao on 17/12/3. * 需求: 子线程先运行10次,然后主线程运行 100次,依次运行50次 * wait(): 等待 如果线程执行了wait方法,那么该线程会进入等待的状态,等待状态下的线程必须要被其他线程调用notify方法才能唤醒。 notify(): 唤醒 唤醒线程池等待线程其中的一个。 notifyAll() : 唤醒线程池所有等待 线程。 wait与notify方法要注意的事项: 1. wait方法与notify方法是属于Object对象 的。 2. wait方法与notify方法必须要在同步代码块或者是同步函数中才能 使用。不在同步代码里执行,会报错 3. wait方法与notify方法必需要由锁对象调用。 wait():一个线程如果执行了wait方法,那么改线程就会进入一个以锁对象为标识符的线程池中等待。 此时 线程释放了锁,进入“临时阻塞”状态,并在其他线程调用notify方法才能将其唤醒, 唤醒后的该线程是“可 运行”状态,获得到cpu后即可执行。 Notify():如果一个线程执行notify方法,那么就会唤醒以锁对象为标识符的线程池中等待线程中的其中一个。 锁对象是Object 对象; 只有同步代码块或同步方法中才有锁; 线程池是以锁为标识符建立的 */ import java.util.concurrent.atomic.AtomicInteger; public class Thread04_TraditionalThread_Communication { public static void main(String[] args) { final Business business = new Business(); new Thread( new Runnable() { public void run() { for(int i=1;i<=50;i++){ business.sub(i); } } } ).start(); for(int i=1;i<=50;i++){ business.main(i); } } }class Business { private boolean bShouldSub = true; public synchronized void sub(int i){ while(!bShouldSub){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } for(int j=1;j<=10;j++){ System.out.println("sub thread sequence of " + j + ",loop of " + i); } bShouldSub = false; this.notify(); } public synchronized void main(int i){ while(bShouldSub){ try { this.wait(); } catch (InterruptedException e) { e.printStackTrace(); } } for(int j=1;j<=100;j++){ System.out.println("main thread sequence of " + j + ",loop of " + i); } bShouldSub = true; this.notify(); }}
时间: 2024-10-09 06:08:35