`

Java复习笔记12—多线程相关

 
阅读更多

先给出一个问题引入:

 

请编写一个多线程程序,实现两个线程,其中一个线程实现对某个成员变量每次加1操作,另外一个线程则实现对某个成员变量每次减一操作。同时,保证成员变量的值不大于1,不小于0。该成员变量的初始值为0。

 

要实现这个问题,显然我们需要使用多线程进行约束操作。

 

 

package Code;

public class Sample {
	
	private int number;
	
	public synchronized void increase()
	{
		if(number != 0)
		{
			try {
				wait();
			}
			catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		number++;
		
		System.out.println(number);
		notify();
	}
	
	public synchronized void decrease()
	{
		if(number == 0)
		{
			try {
				wait();
			}
			catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		number--;
		
		System.out.println(number);
		notify();
	}
}

 

 

 

 

package Code;

public class IncreaseThread extends Thread {
	
	private Sample sample;
	
	public IncreaseThread (Sample sample)
	{
		this.sample = sample;
	}

	@Override
	public void run() {
		for(int i = 0; i < 20; i++)
		{
			try {
				Thread.sleep((long)(Math.random() * 1000));
			}
			catch (InterruptedException e) {
				e.printStackTrace();
			}
			sample.increase();
		}
	}

}

 

 

 

 

package Code;

public class DecreaseThread extends Thread {

	private Sample sample;
	
	public DecreaseThread (Sample sample)
	{
		this.sample = sample;
	}

	@Override
	public void run() {
		for(int i = 0; i < 20; i++)
		{
			try {
				Thread.sleep((long)(Math.random() * 1000));
			}
			catch (InterruptedException e) {
				e.printStackTrace();
			}
			sample.decrease();
		}
	}
}

 

 

 

 

package Code;

public class MainTest {

	public static void main(String[] args) {
		
		Sample sample = new Sample();
		
		Thread thread1 = new IncreaseThread(sample);
		Thread thread2 = new DecreaseThread(sample);
		
		thread1.start();
		thread2.start();
	}

}

 

 

以上程序就实现了上述题目要求的功能。

另外如果需要加入更多的线程进行控制,为了避免唤醒混乱,我们只需要将代码改为以下即可:

 

 

		while(number != 0)
		{
			try {
				wait();
			}
			catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

 

 

这里总结一下多线程比较重要的知识点:

 

1.如果一个线程调用了某个对象的wait方法,那么该对象首先必须要拥有该对象的锁。(即wait方法处于synchronized中)

2.如果一个线程调用了某个对象的wait方法,那么该线程就会马上释放拥有该对象的锁。

3.在JAVA对象中,有两种池:锁池和等待池。

4.如果一个线程调用了某个对象的wait方法,该线程进入该对象的等待池中,并释放该对象的锁。如果之后另外一个线程调用了同一个对象的notify或notifyAll方法,则该等待池中等待的线程就会起来进入这个对象的锁池中,去等待获得该对象的锁,如果获得该对象的锁成功,该线程将会继续沿着wait之后的路径运行。

5.Sleep方法不会释放对象的锁(的拥有权)。

 

分享到:
评论

相关推荐

    Java多线程.pdf

    Java多线程复习笔记,包括线程创建,关键字讲解,线程池等等。

    Java基础复习笔记.docx

    《Java基础复习笔记.docx》是一份宝贵的学习资源,旨在帮助那些已经具有一定Java编程基础的学习者巩固知识、进行复习以及更深入地理解Java编程的核心概念。以下是对这个资源的详细描述: 全面的复习内容:这份资源...

    java高级复习笔记.zip

    以下是对这个资源的详细描述: 全面的高级主题覆盖:这份文档涵盖了Java编程的高级主题,包括但不限于多线程编程、数据结构与算法、设计模式、I/O 操作、异常处理、性能优化等。每个主题都经过详尽的讲解,使学习者...

    java高级复习笔记-程序阅读题.docx

    《Java高级复习笔记-程序阅读题.docx》是一份宝贵的学习资源,特别适合那些希望深入理解和掌握Java高级编程概念的学习者和开发者。以下是对这个资源的详细描述: 深度理解编程概念:这份文档提供了一系列程序阅读...

    java多线程编程总结

    java多线程编程总结,超级细致与权威,我看过的最好的理解多线程知识点的复习资料

    Java架构核心笔记

    这一份文档由华为架构师编写,梳理了Java所有高难度知识点:JVM,多线程, IO, Java与系统底层的交互详情等等,适合面试BAT等大厂之前做为复习资料 Java 架构面试知识点梳理.

    吉林大学Java程序设计期末复习笔记

    内含课程所有章节的知识点,主要有Java基础语法、面向对象、多线程、集合(List集合、Map),还有一些小练习

    java多线程应用实现方法

    —————————————————————————————————————————————————- java中的多线程 在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runabl

    Java基础(韩顺平版)笔记详

    多线程和并发编程基础 Java基础类库:实用工具类和日期时间API JDBC数据库操作 适用人群 计算机专业新生和初学者,希望系统学习Java编程。 在校学生,需要为相关课程准备或复习。 自学者,希望通过自学掌握Java编程...

    Java+复习笔记+源自宋红康老师视频+个人的一些理解

    基本语法+面向对象+数组+异常+多线程等

    Java基础课程全套笔记.zip

    以下是对这个资源的详细描述: 全面的高级主题覆盖:这份文档涵盖了Java编程的高级主题,包括但不限于多线程编程、数据结构与算法、设计模式、I/O 操作、异常处理、性能优化等。每个主题都经过详尽的讲解,使学习者...

    某大学往年期末考试题:Java考试(含答案).docx

    复习相关教材、笔记、视频教程等。 练习编写简单的Java程序,包括控制流、循环、函数、类和对象等基本概念。 熟悉Java的异常处理机制,了解如何捕捉和处理异常。 了解Java的集合框架和泛型,包括List、Set、Map等...

    Java SE查阅手册.pdf

    笔记适合了解Java或者有学过其他编程语言的Java初学者学习,多线程与IO的提高笔记与Spring的笔记还在总结当中,另外Linux、MySQL的笔记以后也会发布。现在也是边学习边总结,所以总结的此笔记必然有不足的地方,如果...

    观看韩顺平Java的 所做的笔记 到互斥锁 其中里面有我很多心得 老手可以用来复习 新手可以用学习 也可以当做参考 来做笔记

    包装类 String 类 字符串的特性 String 类的常见方法 StringBuffer 类 Math 类 Arrays 类 System 类 日期类包括1代2代3代 集合 集合的框架体系 Collection 接口和常用方法 Collection 接口...JUnit 多线程基础 互斥锁

    java并发基础-课堂笔记

    该内容是在暮课网学习的课程比较,讲解进程、线程、多线程和高并发等基础知识。上传网上以供自己以后复习。

    JAVA-SE基础知识.pdf

    文档包含for/while/do-while、方法、方法重载、数组、面向对象、单例、重写、多态、抽象类、内部类、异常、String、八大基本数据类型、日期、集合、文件、多线程、网络编程、反射等基础讲解笔记。

    《Java语言程序设计》课程教学设计方案.doc

    " " " "第 6 章 Java的基本可重用类"3 "3 " " " " "第 7 章 图形用户界面 "3 "3 " " " " "第 8 章 多线程程序设计 "3 "3 " " " " "第 9 章 Java小应用程序 "3 "3 " " " " "第 10 章 网络编程基础 "3 "2 " " " " "第 ...

    尚硅谷_互联网大厂高频重点面试题(第2季).xmind

    上半场,从多线程并发入手,分层递进讲解,逐步让大家掌握volatile、原子类和原子引用、CAS、ABA、Java锁机制、阻塞队列、线程池等重点;下半场,逐步过渡到JVM和GC的知识,深度讲解多种常见OOM异常和JVM参数调优,...

    word源码java-ShangGuiGu-ZhouYang-JUC:周阳-juc

    复习java基础知识的笔记 进程和线程: 进程和线程主要区别在于他们是操作系统不同的资源管理方式. 进程是程序的一次执行过程(运行中的程序),是系统运行程序的基本单位. 一个进程至少包含一个线程(main), 可以包含多个...

    leetcode题库-Code-learning:学习笔记记录,形成打代码的好习惯

    leetcode题库 该站点的目的是记录自己学习笔记,欢迎大家指点关注! 在线阅读地址: 每天坚持做的小目标 每天做三道 ...多线程 框架 二 、数据库 三、Linux 四、工具 五、算法 六、go 七、谷粒商城学习笔记

Global site tag (gtag.js) - Google Analytics