多线程的学习

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

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

 

尝试着做了一下,首先定义了一个内部类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();
		}
	}
}

输出的结果如下

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

时间: 2024-09-25 07:40:43

多线程的学习的相关文章

posix-Posix多线程深入学习?

问题描述 Posix多线程深入学习? 看了<linux程序设计>里面的多线程章节,又看了<linux高级程序设计>里面的多线程的一半,感觉还是不太懂,让我看代码我知道怎么回事,让我自己写我就不会了.想问问几个问题: 1.<unix高级环境编程>里面讲的多线程透彻吗?或者大家可以推荐本好书,主要希望是多点多线程的实例应用.. 2.希望熟悉多线程,不知道可以去做点什么小项目,来加深理解?大家有推荐的小项目么?这个主要是对线程理解不够深入,希望透过项目或者一些优秀的项目代码看

Python多线程编程学习

Python 提供了几个用于多线程编程的模块,包括thread, threading 和Queue 等.thread 和threading 模块允许程序员创建和管理线程.thread 模块提供了基本的线程和锁的支持,而threading提供了更高级别,功能更强的线程管理的功能.Queue 模块允许用户创建一个可以用于多个线程之间共享数据的队列数据结构. 注意:避免使用thread模块,因为它不支持守护线程.当主线程退出时,所有的子线程不论它们是否还在工作,都会被强行退出. 下面重点说说threa

Java多线程CyclicBarrier学习

CyclicBarrier是多线程并发控制实用工具   CyclicBarrier初始化时规定一个数目,然后调用await()方法进入等待的线程数.当线程数达到了这个数目时,所有进入等待状态的线程被唤醒并继续执行. await() 方法没被调用一次,计数便会减少1,并阻塞住当前线程.当计数减至0时,阻塞解除,所有在此 CyclicBarrier 上面阻塞的线程开始运行. CyclicBarrier就象它名字的意思一样,可看成是个障碍, 所有的线程必须到齐后才能一起通过这个障碍. CyclicBa

C/C++ 多线程的学习心得总结_C 语言

个人觉得在学习多线程编程之前最好先了解进程和线程的关系, 然后在学习线程工作方式的过程中动手写个(我是从抄开始的)多线程的小程序, 会对学习多线程有很大的帮助, 否则只有理论是很抽象的. 在学习多线程编程之前, 必须先知道什么是 线程函数, 线程函数就是另一个线程的入口函数. 默认情况下一个我们所写的代码都是只有一个线程的, 而这个线程的入口函数就是main() 函数, 这是系统默认的. 而我们创建的另一个线程也需要一个函数来进入, 这个函数就叫做线程函数. 在C/C++中, 可以调用 '运行期

java多线程例子学习笔记

java在2007年的时候编写过多线程爬虫,当时对多线程的理解仅仅限于可以同时并发任务,对于多线程之间的调度,完全没有理解.所以后来这的多线程的应用仅仅限于只能多线程并发任务.其实一切在线程中都可以被监控. 看下面的列子,我们来理解多线程之间如何进行控制的.  代码如下 复制代码 package com.javaer.thread;   public class PrintABC {   public static Boolean isThreadA = true; public static

多线程程序设计学习(2)之single threaded execution pattern

Single Threaded Execution Pattern[独木桥模式] 一:single threaded execution pattern的参与者--->SharedResource(共享资源) 二:single threaded execution pattern模式什么时候使用--->多线程程序设计时--->数据可被多个线程访问的时候--->共享资源状态可能变化的时候--->需要确保数据安全性的时候 三:single threaded execution p

多线程程序设计学习(3)immutable pattern模式

Immutable pattern[坚不可摧模式] 一:immutable pattern的参与者--->immutable(不变的)参与者        1.1:immutable参与者是一个字段的值都无法更改的类.        1.2:immutable也没有任何用来更改字段值的方法.        1.3:immutable参与者方法不需要设置synchronized 二:immutable pattern模式什么时候使用--->当实例产生后,状态不再变化时        2.1实例状

多线程程序设计学习(6)Producer-Consumer模式

Producer-Consumer[生产消费者模式]一:Producer-Consumer pattern的参与者--->产品(蛋糕)--->通道(传递蛋糕的桌子)--->生产者线程(制造蛋糕的线程)--->消费者线程(吃掉蛋糕的线程)         二:Producer-Consumer pattern模式什么时候使用--->大量生产+大量消费的模式 三:Producer-Consumer pattern思考--->[生产消费者模式],肩负保护数据安全性使命的是通道

多线程程序设计学习(1)之多线程程序的评量标准

多线程程序的评量标准--->安全性[不损坏对象]        (1)不损坏对象是一种比喻手法,就是数据的一致性.比如银行的扣款操作,并发扣款,账户不会出现负数的余额.--->生存性[进行必要的处理]        (1)指也许不是现在,但一定会进行的必要处理.好比异常处理机制.在出现多线死锁等情况下的必要处理.--->复用性        (1)指可再利用的类,这不是必要条件,但却是体现程序质量重点条件.封装的意思.        (2)如果A类是一个已经确定可正常使用的软件程序的一部