多线程的学习

简介: 闲来无事,在逛论坛时偶然看到这样一道题:          子线程循环十次,接着主线程循环一百次,接着又回到子线程循环十次,然后主线程再循环一百次,如此循环往复,循环五十次。   尝试着做了一下,首先定义了一个内部类Circle,类中有两个方法分别演示子线和主线的循环,main方法和sub方法,并给这两个方法加锁,用synchronized修饰方法。接着在主函数中定义了一个多线程方法

闲来无事,在逛论坛时偶然看到这样一道题:

         子线程循环十次,接着主线程循环一百次,接着又回到子线程循环十次,然后主线程再循环一百次,如此循环往复,循环五十次。

 

尝试着做了一下,首先定义了一个内部类Circle,类中有两个方法分别演示子线和主线的循环,main方法和sub方法,并给这两个方法加锁,用synchronized修饰方法。接着在主函数中定义了一个多线程方法,用来输出五十次的子线程循环,在方法内进行了五十次的主线程循环。此时可以输出五十次的主线和子线了,但是顺序乱了,并不能按题目要求的那样先子线循环十次接着主线循环一百次,解决办法是定义一个nowSub的布尔方法,每次执行前先判断,符合时执行,不符合时等待,执行结束后用notify唤起等待线程。

 

实现代码如下:

public class Communication {
	
	public static void main(String[] args) {
		final Circle circle=new Circle();
		new Thread(new Runnable(){
			@Override
			public void run() {
				for(int i=1;i<=50;i++){
					circle.sub(i);
				}
			}
		}).start();
		for(int i=1;i<=50;i++){
			circle.main(i);
		}
	}
	static class Circle{
		private boolean nowSub=true;
		public synchronized void sub(int i){
			if(!nowSub){
				try {
					this.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			for(int j=1;j<=10;j++){
				System.out.println("子线循环"+j);
			}
			nowSub=false;
			notify();
		}
		public synchronized void main(int i){
			if(nowSub){
				try {
					this.wait();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			for(int j=1;j<=100;j++){
				System.out.println("主线循环"+j+"**********总循环:"+i);
			}
			nowSub=true;
			notify();
		}
	}
}

输出的结果如下


结果满足了题目要求,或许也有更好的方法,欢迎大家尝试。


目录
相关文章
|
5月前
|
安全 编译器 C#
C#学习相关系列之多线程---lock线程锁的用法
C#学习相关系列之多线程---lock线程锁的用法
|
5月前
|
Java 调度 C#
C#学习系列相关之多线程(一)----常用多线程方法总结
C#学习系列相关之多线程(一)----常用多线程方法总结
|
5月前
|
C#
C#学习相关系列之多线程---ConfigureAwait的用法
C#学习相关系列之多线程---ConfigureAwait的用法
100 0
|
5月前
|
C#
C#学习相关系列之多线程---TaskCompletionSource用法(八)
C#学习相关系列之多线程---TaskCompletionSource用法(八)
136 0
|
1月前
|
监控 Java 调度
【Java学习】多线程&JUC万字超详解
本文详细介绍了多线程的概念和三种实现方式,还有一些常见的成员方法,CPU的调动方式,多线程的生命周期,还有线程安全问题,锁和死锁的概念,以及等待唤醒机制,阻塞队列,多线程的六种状态,线程池等
117 6
【Java学习】多线程&JUC万字超详解
|
4月前
|
NoSQL Redis
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
Redis系列学习文章分享---第五篇(Redis实战篇--优惠券秒杀,全局唯一id 添加优惠券 实现秒杀下单 库存超卖问题分析 乐观锁解决超卖 实现一人一单功能 集群下的线程并发安全问题)
110 0
|
4月前
|
调度 Python
Python多线程学习优质方法分享
Python多线程学习优质方法分享
23 0
|
4月前
|
安全 API C++
逆向学习Windows篇:C++中多线程的使用和回调函数的实现
逆向学习Windows篇:C++中多线程的使用和回调函数的实现
151 0
|
5月前
|
Java 调度
【JAVA学习之路 | 提高篇】进程与线程(Thread)
【JAVA学习之路 | 提高篇】进程与线程(Thread)
|
5月前
|
安全 Java
java-多线程学习记录
java-多线程学习记录