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

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多线程编程详解

    ### Java多线程编程详解:深入理解与实践 #### 一、理解多线程机制 多线程,作为现代编程语言的重要特性之一,允许在单一应用程序内并发执行多个任务,从而极大提升了程序的效率和响应速度。在Java中,多线程的...

    Java多线程机制(讲述java里面与多线程有关的函数)

    Java多线程机制是Java编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...

    java多线程.pdf

    ### Java多线程知识点详解 #### 一、Java多线程概述 **Java多线程**是指在Java程序中能够同时执行多个线程的技术。这种技术使得程序可以在多个任务之间并发执行,从而提高了程序的效率和资源利用率。本文将根据...

    java多线程课件

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的并发性和效率。在Java中,线程是程序执行的基本单元,是轻量级的进程,它们共享同一份代码和数据空间,但每个线程有自己的栈和程序...

    java多线程,对多线程,线程池进行封装,方便使用

    Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,我们可以通过实现Runnable接口或继承Thread类来创建线程。然而,直接使用线程可能存在一些问题,如资源管理...

    java 多线程课件

    Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,从而提高了程序的效率和响应速度。在Java中,多线程支持是语言级别的,这意味着开发者可以轻松地创建和管理并发执行的线程。 首先,我们要理解...

    JAVA多线程模型详解

    本文将深入探讨Java多线程模型的相关知识点,包括线程与进程的区别、线程的实现原理、线程的创建方法以及线程的阻塞与唤醒机制等,旨在为初学者提供一个清晰的多线程概念理解和使用指南。 一、线程与进程的区别 在...

    java多线程编程

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提升系统效率。在本教程中,我们将深入探讨Java中的多线程设计模式、并发核心编程概念以及线程池的工作原理和种类。 首先,让我们了解什么...

    Java多线程编程模板

    本知识点将深入探讨Java多线程编程模板,帮助开发者理解和掌握如何在Java中创建、管理和同步线程。 一、线程的创建 在Java中,有两种主要的线程创建方式: 1. 继承Thread类:创建一个新的类,该类继承自Thread类,...

    java多线程教程——一个课件彻底搞清多线程

    Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,从而提高应用程序的效率和响应性。本教程将深入讲解Java线程的相关知识,包括进程与线程的基本概念、线程的创建和启动、多线程的互斥与同步、线程...

    JAVA多线程探讨 (2).pptx

    【JAVA多线程探讨】 Java多线程是Java编程中不可或缺的一部分,特别是在处理并发和分布式系统时。在Java中,多线程允许程序同时执行多个不同的任务,从而提高应用程序的效率和响应性。本篇文章将深入探讨Java多线程...

    Java_多线程与并发编程总结.doc

    Java多线程与并发编程是Java开发中至关重要的一部分,它涉及到如何高效地利用CPU资源,以实现程序的并行执行。在操作系统层面,多任务和多进程是通过分配不同的内存空间来实现的,而线程则共享同一进程的内存,这...

    JAVA多线程(精典总结)

    Java多线程是Java编程中不可或缺的部分,尤其在面试中,多线程的知识点经常被问及。本文将深入探讨Java多线程的核心概念、创建方式、线程状态转换、线程调度以及线程优先级调整。 首先,理解线程的基本概念至关重要...

    java多线程学习资料

    ### Java多线程学习资料知识点解析 #### 一、引言 Java作为一种广泛使用的编程语言,在并发编程领域具有独特的优势。多线程是Java中实现并发处理的核心技术之一,能够显著提升程序的性能和响应性。本文将深入探讨...

    第15讲 Java多线程.ppt

    "Java多线程" Java多线程是Java语言中的一种编程方式,用于实现多任务的并发执行。Java多线程可以提高程序的效率和响应速度,使得程序更加灵活和高效。 进程与线程的概念: * 进程是操作系统管理的执行单位,多个...

    java 多线程

    ### Java多线程知识点详解 #### 一、Java Thread 概念 在Java中,**线程**是一种轻量级的进程,它是程序执行流的最小单元。一个标准的Java应用通常至少包含一个线程,即主(Main)线程。Java支持多线程编程,这...

    java多线程教程 java多线程教程

    Java多线程教程详解 Java多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个任务,提高程序效率和响应速度。理解并熟练运用Java的多线程机制是成为一个专业Java开发人员的关键技能。 一、线程的概念与...

Global site tag (gtag.js) - Google Analytics