`
oboaix
  • 浏览: 268966 次
社区版块
存档分类
最新评论

java多线程共享对象切换标志

    博客分类:
  • JAVA
阅读更多

      直接上题:

      要求创建三个线程,输出1-90, 最开始第一个线程输出1-5,第二个输出6-15,第三个输出16-30
 接着再第一个线程输出31-35, 再第二个36-45,再第三个46-60...就这样循环下去,直到打印出90个数。

 与互联网其他解决输出 1~75有差异,并且有些是错误,线程不安全的,这里进行常规方法改进。

jdk版本提升7,8后,synchronized大幅得以提升。

      解决办法:通俗处理方式,简单易理解,使用共享对象,使用标志位转移线程状态,比较灵活。

 

package com.dennis.study.thread;

/**
 * 要求创建三个线程,输出1-90, 最开始第一个线程输出1-5,第二个输出6-15,第三个输出16-30
 * 接着再第一个线程输出31-35, 再第二个36-45,再第三个46-60...就这样循环下去,直到打印出90个数
 * 解决办法:通俗处理方式,简单易理解,使用共享对象,使用标志位转移线程状态,比较灵活。
 * 
 * @author dennis
 * 
 */
public class Thread3_1to90 {

	static ShareData3_ sd = new ShareData3_(1);
	
	public static void main(String[] args) {
		new Thread(new Runnable() {
			@Override
			public void run() {
				sd.print1();
			}
		}).start();
		new Thread(new Runnable() {
			@Override
			public void run() {
				sd.print2();
			}
		}).start();
		new Thread(new Runnable() {
			@Override
			public void run() {
				sd.print3();
			}
		}).start();
		while (Thread.activeCount() > 0) {
			Thread.currentThread().setDaemon(true);
		}
	}
}

class ShareData3_ {

	private static int num = 0;
	private volatile int flag = 1;
	private final static int end = 90; 
	
	public ShareData3_( int f) {
		this.flag = f;
	}

	/**
	 * 1~5 31~35,61~65,
	 */
	public synchronized void print1() {
		while(num < end) {
			while(flag > 1) {
				wait_();
			}
			while (num % 30 < 5 && num < end) {
				for (int i = 0; i < 5; i++) {
					System.out.println("print1 = " + Thread.currentThread().getName() + "\t" + ++num);
				}
			}
			sleep_();
			flag  = 2;
			notifyAll();
		}
	}

	

	/**
	 * 6~15 36~45,66~75,
	 */
	public synchronized void print2() {
		while(num <end) {
			while(flag != 2) {
				wait_();
			}
			while (num % 30 < 15 && num % 30 > 4  && num < end) {
				for (int i = 0; i < 10; i++) {
					System.out.println("print2 = " + Thread.currentThread().getName() + "\t" + ++num);
				}
			}
			sleep_();
			flag  = 3;
			notifyAll();
		}
	}
	
	/**
	 * 16~30 46~60,76~90,
	 */
	public synchronized void print3() {
		while(num < end) {
			while(flag < 3) {
				wait_();
			}
			while (num % 30 > 14  && num < end) {
				for (int i = 0; i < 15; i++) {
					System.out.println("print3 = " + Thread.currentThread().getName() + "\t" + ++num);
				}
			}
			sleep_();
			flag  = 1;
			notifyAll();
		}
	}
	
	private final void sleep_() {
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	private final void wait_() {
		try {
			wait();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
}

 记录使用 ^_^

分享到:
评论

相关推荐

    java多线程同步问题

    多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!

    Java多线程之基础篇(一).docx

    与此相反,像java所使用的这种并发系统会共享内存或I/O这样的资源,因此编程编写多线程程序最基本的困难在于,协调不同线程驱动的任务之间这些资源的使用,以便使得这些资源不会同时被多个任务访问。

    Java多线程编程的优点和缺点

    加快响应用户的时间:多线程允许并发执行多个任务,可以充分利用多核处理器,从而提高程序的性能和响应速度。比如我们经常用的迅雷下载,都喜欢多开几个线程去下载,谁都不愿意用一个线程去下载,为什么呢?答案很简单,...

    Java多线程之进阶篇(一).docx

    与此相反,像java所使用的这种并发系统会共享内存或I/O这样的资源,因此编程编写多线程程序最基本的困难在于,协调不同线程驱动的任务之间这些资源的使用,以便使得这些资源不会同时被多个任务访问。

    Java多线程之进阶篇(二).docx

    与此相反,像java所使用的这种并发系统会共享内存或I/O这样的资源,因此编程编写多线程程序最基本的困难在于,协调不同线程驱动的任务之间这些资源的使用,以便使得这些资源不会同时被多个任务访问。

    Java多线程之基础篇(二).docx

    与此相反,像java所使用的这种并发系统会共享内存或I/O这样的资源,因此编程编写多线程程序最基本的困难在于,协调不同线程驱动的任务之间这些资源的使用,以便使得这些资源不会同时被多个任务访问。

    java线程和容器专题课程第一部分

    java线程和容器专题课程第一部分,共两部分。详细讲解java线程的一些知识和技术原理。...在多线程中,一般对于static用的比较多,其特殊性起到了共享数据的作用,而Random提供了随机数且它是线程安全的。

    JAVA实现Modbus RTU或Modbus TCPIP数据采集.rar

    2.多线程之间为更方便的实现数据共享采用了共享相同内存地址空间的形式,并且是并发运行,导致多个线程可能会同时访问或修改其他线程正在使用的变量值,导致安全性,同时如果线程之间相互等待对方拥有的锁,会出现...

    Java基础多线程编程

    线程是进程内部独立执行的流程,一个进程的所有线程共享一个内存空间,CPU在线程之间来回的切换,CPu在线程之间切换的消耗远远小于在进程之间的切换消耗,线程是小的处理单位  关键字:Thread  3.线程的实现: ...

    java源码包---java 源码 大量 实例

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    Java线程详解(线程概念、代码示例、周期解析等)

    但与进程不同的是,同类的多个线程是共享一块内存空间和一组系统资源,而线程本身的数据通常只有微处理器的寄存器数据,以及一个供程序执行时使用的堆栈。所以系统在产生一个线程,或者在各个线程之间切换时,负担要...

    JAVA上百实例源码以及开源项目

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    JAVA上百实例源码以及开源项目源代码

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    java源码包4

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    java源码包3

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    java 编程入门思考

    1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 不要迷失 1.12.2 阶段0:拟出一个计划 1.12.3 阶段...

    Java初学者入门教学

    1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 不要迷失 1.12.2 阶段0:拟出一个计划 1.12.3 阶段...

    java联想(中文)

    1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 不要迷失 1.12.2 阶段0:拟出一个计划 1.12.3 阶段...

    java源码包2

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    JAVA_Thinking in Java

    1.9 多线程 1.10 永久性 1.11 Java和因特网 1.11.1 什么是Web? 1.11.2 客户端编程 1.11.3 服务器端编程 1.11.4 一个独立的领域:应用程序 1.12 分析和设计 1.12.1 不要迷失 1.12.2 阶段0:拟出一个计划 1.12.3 阶段...

Global site tag (gtag.js) - Google Analytics