Thread02:线程同步通信

package com.test;
/**
 *
 * @author
 * 问题:子线程循环10次,接着主线程循环100,接着又回到子线程10次,
 *     接在再回到主线程又循环100,如此循环50次,请写出程序。
 * 经验:1、要用到共同数据(包括同步锁)的若干个方法应该归属在同一个类身上,
 *       这种设计正好体现了高类聚和程序的健壮性。
 *     2、主线程优先级最高,即main方法先执行(其也是一个线程),线程使用start方法只是标志线程启动,
 *       之后便被放进队列中,并不一定在start之后立马执行。
 */
public class Test4 {
	public static void main(String[] args) {
		final Common com=new Common();

		new Thread(new Runnable() {
			@Override
			public void run() {
				for (int i = 0; i < 50; i++) {
					com.sub();
				}
			}
		}).start();

		new Thread(new Runnable() {
			@Override
			public void run() {
				for (int i = 0; i < 50; i++) {
					com.main();
				}
			}
		}).start();
	}
}

/**
 *
 * @author
 * 分装同步方法的类:此时synchronized同步的对象是this,即当前对象
 * 1、每当子线程方法调用完之后,让子线程等待,主线程开始执行;
 *   主线程执行完一次,主线程等待,唤醒子线程执行,如此循环50次。
 * 2、在线程执行过程中,可能需要子线程先执行,则将线程间通信变量isSubRun=true,即表示子线程先运行;
 *   isSubRun=false,即表示主线程执行。
 */
class Common{
	private boolean isSubRun=true;

	/**
	 * 子线程方法
	 */
	  public synchronized void sub(){
		  if(!isSubRun){
			  try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		  }

		  for(int i = 0; i < 10; i++){
			  System.out.println("sub thread ->"+i);
		  }

		 isSubRun=false;
		 this.notify();
	  }

	  /**
	   * 主线程方法
	   */
	  public synchronized void main(){
		  if(isSubRun){
			  try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		  }

		  for(int i = 0; i < 100; i++){
			  System.out.println("main thread ->"+i);
		  }

		  isSubRun=true;
		  this.notify();
	  }

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 02:22:12

Thread02:线程同步通信的相关文章

Lock&Condition实现线程同步通信

import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ConditionCommunication {     final Business business = new Business();     public static void main(Stri

Lock&amp;Condition实现线程同步通信

一,Lock Lock比传统的线程模型中的synchronized方式更加面向对象,因为"锁"本身就是一个对象. 两个线程执行的代码要实现同步互斥的效果,他们必须用同一个Lock对象. 读写锁:(1)读锁:多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,我们只需要代码中用对相应的锁即可.如果只读数据,那么可以很多人(线程)同时读,但是不能同时写,此时就加读锁.如果代码需要修改数据,此时只能一个人(一个线程)写,此时不能同时读,那么就加写锁. 总之,读时,上读锁:写时,上写锁.

Java多线程与并发应用-(9)-锁lock+条件阻塞conditon实现线程同步通信

一. lock可以代替synchronized关键字实现互斥功能.使用方法如下: Lock l = ...; l.lock(); try { // access the resource protected by this lock } finally { l.unlock(); } 需要注意的是. 1.需要互斥的一个或多个方法要使用同一个互斥锁. 2.在被锁包含的代码块中,要使用finally块将锁释放. 二. Condition的await方法(注意不是wait方法)可以替换传统通信中的wa

【Java多线程与并发库】4.传统线程同步通信技术

我们先通过一道面试题来了解传统的线程同步通信. 题目:子线程循环10次,接着主线程循环100次,接着又回到子线程循环10次,接着再回到主线程又循环100次,如此循环50次,请写出程序. 我没有看答案,先用自己的思路写了一段代码,有一些是借鉴传统的“生产者与消费者”的多线程模型写出来的:[java] view plain copy 在CODE上查看代码片派生到我的代码片package cn.edu.hpu.test; /** * 要求的操作: * 子线程循环10次,接着主线程循环100次,接着又回

Java多线程及JDK5线程工具类总结

内容摘抄来自:传智播客 张孝祥 老师的<Java高新技术>视频,   并加入了个人总结和理解. 虽然我没有参加过任何培训班,但我很大一部分知识都来自于传智播客的网络分享视频. 十分真挚的感谢张老师的公开视频. 1.传统线程技术的回顾 1 import org.junit.Test; 2 /** 3 * 传统线程回顾 4 * 多线程不一定会提高运行效率,和CPU设计和架构有关. 5 * 多线程下载是抢了服务器的资源,并不是自身的机器加快. 6 * @author LiTaiQing 7 */ 8

3、传统线程同步与通信--生产消费例子

核心点: 1.锁对象必须是同一个. 2.wait()和notify()方法必须是调用锁对象的方法,而非this(线程)的. 3.在多生产多消费的时候注意使用notifyAll而不是notifyAll,否则会造成死锁 测试代码: 1 import java.util.LinkedList; 2 import java.util.Queue; 3 import java.util.Random; 4 5 /** 6 * 多个生产 - 消费 线程同步通信 7 * 核心点: 8 * 1.锁对象必须是同一

JDK5什么是新的线程锁技术(两)

一个. Lock线程同步实现互斥 Lock比传统线程模型中的synchronized方式更加面向对象,与生活中的锁类似,锁本身也是一个对象. 两个线程运行的代码片段要实现同步相互排斥的效果.他们必须用同一个Lock对象.锁是上在代表要操作的资源的类的内部方法中, 而不是线程代码中. public class LockTest { public static void main(String[] args) { new LockTest().init(); } private void init(

JAVA 并发编程-线程同步通信技术(Lock和Condition)(十)

在之前的博客中已经介绍过线程同步通信技术<JAVA 并发编程-传统线程同步通信技术(四)>,上篇是使用的synchronized,wait,notify来实现,今天我们使用的是Lock和Condition,下面我们结合两者对比来学习. 简单的Lock锁应用: /** * 简单Lock的应用 * @author hejingyuan * */ public class LockTest { public static void main(String[] args) { new LockTest

JAVA 并发编程-传统线程同步通信技术(四)

首先介绍几个概念: wait()方法 wait()方法使得当前线程必须要等待,等到另外一个线程调用notify()或者notifyAll()方法. 当前的线程必须拥有当前对象的monitor,也即lock,就是锁. 线程调用wait()方法,释放它对锁的拥有权,然后等待另外的线程来通知它(通知的方式是notify()或者notifyAll()方法),这样它才能重新获得锁的拥有权和恢复执行. 要确保调用wait()方法的时候拥有锁,即,wait()方法的调用必须放在synchronized方法或s