`

jdk1.5——多线程操作之线程同一锁下通讯写法

 
阅读更多

 

0 代码案例:

 

package thread;

/**
 * 
 * @author zm
 * 执行结果:
第 0 次执行B
第 1 次执行A
第 1 次执行B
第 2 次执行A
第 2 次执行B
第 3 次执行A
第 3 次执行B
第 4 次执行A
第 4 次执行B
第 5 次执行A
第 5 次执行B
第 6 次执行A
第 6 次执行B
第 7 次执行A
第 7 次执行B
第 8 次执行A
第 8 次执行B
第 9 次执行A
第 9 次执行B
 *
 * 须知:
 * 1 高内聚 将业务方法封装到业务类上 在业务方法上设置锁,这样调用的线程只要使用同一个业务对象,就可以实现业务方法的互斥
 * 2 多线程之间通讯的前提仍旧是业务方法上的锁是同一个,使用关键词  notify()  wait() 实现多线程同一锁下的等待效果
 */
public class CommunicateThread {

	// A 执行一次  B 执行一次  一共执行20次
	public static void main(String[] args) {
		
		final Out out = new Out(); // out对象就是同一个门栓
		
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				for(int i=0; i<10; i++){
					out.printA(i);
				}
			}
		}).start();
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				for(int i=0; i<10; i++){
					out.printB(i);
				}
			}
		}).start();
		
	}

}

class Out { // 业务方法里面仅需要有业务,不要带线程的任何东西,  注意方法需要互斥时 需要同一个门栓,也只有使用同一个门栓才能在此线程用完当前门栓后唤醒别的要使用门栓的线程的功能
	
	public boolean flag = true;
	
	public synchronized void printA(int i){
		
		while(!flag){// 当flag = false时,线程执行此业务方法时等待
			try {
				this.wait();// 门栓等待
			} catch (InterruptedException e) {
				e.printStackTrace();
			} 
		}
		System.out.println("第 " + i + " 次执行A"); // 否则直接执行业务方法
		flag = false; // 更改标志位
		this.notify(); // 用完这个门栓了 通知同样在等待使用这个门栓的线程使用此门栓    注意体会this的用法
	}
	
	public synchronized void printB(int j){
		
		while(flag) {// 当flag = true时, 线程执行此业务方法时等待
			try {
				this.wait();// 门栓等待
			} catch (InterruptedException e) {
				e.printStackTrace();
			} 
		}
		System.out.println("第 " + j + " 次执行B");
		flag = true; // 更改标志位
		this.notify(); //
	}
	
}



 

1 脑图:

 



 

  • 大小: 11.3 KB
分享到:
评论

相关推荐

    jdk1.5 1.6 1.7的新特征总结

    1. 并发工具库的改进:包括`java.util.concurrent`包中更多线程安全的数据结构和并发工具,如`ConcurrentHashMap`,`Phaser`等。 2. 轻量级注解处理:允许在编译时处理注解,无需生成额外的源代码或字节码。 3. 动态...

    jdk10 jdk-10.0.2_linux-x64_bin网盘下载

    4. **多线程处理改进**:JDK 10引入了新的ThreadLocalRandom类方法,以提高多线程应用程序的性能。 5. **增强的文件系统API**:增加了对符号链接的支持,使得文件系统的操作更加灵活和强大。 ### 在Linux x64平台...

    jdk1.7 java官网正式版Windows 64位-jdk-7u80-windows-x64.exe

    在多线程处理上,JDK 1.7增强了Fork/Join框架,这是一个并行计算模型,用于分割大型任务并行执行,然后合并结果。它通过RecursiveTask和RecursiveAction类实现,对于大数据处理和计算密集型应用非常有用。 此外,...

    jdk-8u241-docs-all.zip

    1. Lambda表达式:JDK 8引入了Lambda表达式,这是一种简洁的匿名函数写法,极大地简化了处理函数式接口的方式,尤其是在多线程和集合操作中。 2. 方法引用与构造器引用:方法引用允许直接引用已有类或对象的方法,...

    jdk1.8 api 中文文档

    1. **Lambda表达式**:JDK 1.8引入了Lambda表达式,这是一种简洁的匿名函数写法,用于处理函数式接口,简化了多线程编程和事件处理。 2. **Stream API**:新的Stream API允许开发者对集合进行声明式处理,提供了更...

    jdk1.8.0_20免安装版

    - Lambda表达式:这是一种简洁的匿名函数写法,用于处理函数式接口,简化了多线程编程和数据处理。 - 方法引用和构造器引用:进一步提升了代码的简洁性和可读性。 - Stream API:提供了处理集合的新方式,支持串行和...

    jdk-8u144-linux-x64.tar.gz.zip

    - Lambda表达式:这是一种简洁的匿名函数写法,用于简化多线程和函数式编程。 - Stream API:提供了一种新的数据处理方式,使得对集合的操作更加流畅和高效。 - Method References:允许直接引用类或对象的方法,而...

    jdk-8u201-windows-x64.rar

    在这个场景中,我们关注的是JDK的特定版本——"jdk-8u201-windows-x64",这是一个专为64位Windows操作系统设计的Java 8更新201版本。 JDK 8是Java编程语言的一个重大里程碑,它引入了许多新的特性和改进。其中最...

    jdk8_api文档

    1. **Lambda表达式**:JDK 8引入了lambda表达式,这是一种简洁的匿名函数写法,极大地简化了对集合的处理和多线程编程。例如,`Function, R&gt;`接口代表一个接收一个类型T参数并返回类型R结果的函数,`Consumer&lt;T&gt;`...

    jdk-8u221-windows-x64.zip

    在并发编程方面,Fork/Join框架和Parallel Streams的引入,让开发者能够更容易地编写高效的多线程代码。 在类型推断方面,JDK1.8增强了编译器的能力,允许在某些情况下省略类型参数,编译器会自动推断出正确的类型...

    jdk1.8.0_25.zip

    这极大地简化了多线程和集合操作,例如Stream API中的并行处理。 2. **方法引用来代替Lambda**: - 方法引用允许直接引用类或实例的方法,无需编写新的lambda表达式。例如,`Arrays.sort(list, Integer::compareTo...

    JAVA JDK1.8_API(官方下载).zip

    并发包中的Fork/Join框架和Parallel Streams得到了增强,提升了多线程编程的性能。另外,新的ConcurrentHashMap版本V8在并发性能上有显著提升。 **9. Type接口** JDK 1.8引入了Type接口,它是所有类型(包括原始...

    jdk-8u241-windows-x64.rar

    JDK 8是Java历史上的一个重要版本,它引入了Lambda表达式、方法引用来简化多线程编程,新的日期/时间API,Stream API以支持函数式编程,以及默认方法增强了接口的功能。这些改进大大提高了Java的开发效率和代码的...

    jdk1.8.rar

    8. **并发改进**:并发库进行了优化,如`ForkJoinPool`和`Parallel Streams`,使得多线程并行计算性能得到提升。 9. **类型推断增强**:编译器现在可以更准确地推断泛型类型,使得代码更简洁,如`Map, Integer&gt; map...

    单例的多种写法和说明比较

    但在多线程环境下,如果没有正确同步,可能导致多个线程同时创建单例,违背了单例模式的初衷。 ```java public class Singleton { private static Singleton instance; private Singleton() {} public static...

    jdk1.8免费.zip

    7. 并发更新:并发工具类如`ForkJoinPool`和`CompletableFuture`得到了增强,提供了更高效的并行计算解决方案,便于编写多线程程序。 8. Type注解:类型注解允许在类型签名上添加元数据,增强了代码的可验证性和...

    jdk-8 32位

    1. **Lambda表达式**:这是JDK 8最重要的特性之一,它提供了更简洁的匿名函数写法,使得处理函数接口变得更加方便,特别是在集合操作中,如Stream API的使用。 2. **函数式接口**:为了支持lambda表达式,JDK 8引入...

    jdk1.8.0_92.zip

    - 性能优化:针对垃圾收集、内存管理和多线程进行了优化,提升了整体性能。 - 问题修复:解决了前一版本中发现的bug,提高软件的稳定性和可靠性。 总结,JDK 1.8.0_92是Java 8的一个重要更新,它不仅带来了许多创新...

    jdk8 64位安装程序

    1. **Lambda表达式**: JDK 1.8引入了Lambda表达式,这是一种简洁的匿名函数写法,可以用来简化多线程编程和函数式编程。 2. **方法引用和构造器引用**: 这两个特性增强了Lambda表达式的功能,允许直接引用已存在的...

    jdk1.8.0-331

    这些更新可能包括对已知安全漏洞的修补,提升了JVM的垃圾回收效率,以及对内存管理和多线程调度的改进,以确保Java应用程序的稳定性和高效运行。 **总结** JDK 1.8.0_331是Java开发者的重要工具,它带来了许多创新...

Global site tag (gtag.js) - Google Analytics