多线程-让线程执行变得可控

本文介绍了如何通过多线程实现线程间的交替执行,例如两个线程交替打印0~100的奇偶数,并详细解释了使用notifyAll()、notify()和wait()方法在synchronized块中协调线程,确保正确线程的执行顺序,同时展示了如何实现N个线程顺序循环打印数字的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两个线程交替打印0~100的奇偶数:
偶线程:0
奇线程:1
偶线程:2
奇线程:3
......

public class Test {
	
	public static void main(String[] args) {
		// 创建两条线程,奇数线程打印奇数,偶数线程打印偶数
		Thread thread1 = new Thread(new ThreadTask(), "偶数线程");
		Thread thread2 = new Thread(new ThreadTask(), "奇数线程");
		thread1.start();
		thread2.start();
	}
	
	static class ThreadTask implements Runnable {
		// 静态变量:创建对象时不会重置值
		static int value = 0;
		
		@Override
		public void run() {
			while(value < 100){
				// ThreadTask.class加锁后,在释放锁之前不能被其它线程使用;
				synchronized (ThreadTask.class) {
					System.out.println(Thread.currentThread().getName() + ":" + value ++);
					//先唤醒,再让出锁
					ThreadTask.class.notify();
					try {
						//在执行wait()方法后会释放锁,进入等待状态。
						ThreadTask.class.wait();
					} catch (InterruptedException e) {
						System.out.println(666);
					}
				}
			}
		}
	}
}

通过N个线程顺序循环打印从0至100,如给定N=3则输出:
thread0: 0
thread1: 1
thread2: 2
thread0: 3
thread1: 4
.....

public class Test {
	
	// 创建N条线程,循环打印0-100
	public static void main(String[] args) {
		int N = 4;
		for (int i = 0; i < N; i++) {
			Thread thread = new Thread(new ThreadTask(i, N), "thread" + i);
			thread.start();
		}
	}
	
	static class ThreadTask implements Runnable {
		static int value = 0;
		
		private int threadNo;
		
		private int maxNo;
		
		public ThreadTask(int i, int N) {
			this.threadNo = i;
			this.maxNo = N;
		}

		@Override
		public void run() {
			while(value < 100){
				// 加锁后,在释放锁之前不能被其它线程使用;在执行wait()方法后会释放锁,进入等待状态。
				synchronized (ThreadTask.class) {
					//当线程执行的顺序不对时,线程进入等待状态
					while ((value - threadNo) % maxNo != 0) {
						try {
							ThreadTask.class.wait();
						} catch (InterruptedException e) {
							System.out.println(666);
						}
					}
					//否则打印数字并唤醒大家,然后进入等待状态
					System.out.println(Thread.currentThread().getName() + ":" + value ++);
					ThreadTask.class.notifyAll();
					try {
						ThreadTask.class.wait();
					} catch (InterruptedException e) {
						System.out.println(666);
					}
				}
			}
		}
	}
}

notifyAll()方法唤醒所有线程,然后大家会去抢夺锁,抢到的线程再判断应不应该是这个线程,是的话则执行程序,不是就继续等待让出锁,直到正确的线程执行完程序后再唤醒大家,自己进入等待状态。

notify()、notifyAll()、wait()方法必须在synchronized关键字内使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值