直接上题:
要求创建三个线程,输出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编程中至关重要的一部分,它允许程序同时执行多个任务,提升应用程序的效率和响应性。以下是对各个知识点的详细说明: 9.1 Java中的线程: Java程序中的线程是在操作系统级别的线程基础上进行...
### Java多线程知识点详解 #### 一、Java多线程概述 **Java多线程**是指在Java程序中能够同时执行多个线程的技术。这种技术使得程序可以在多个任务之间并发执行,从而提高了程序的效率和资源利用率。本文将根据...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的并发性和效率。在Java中,线程是程序执行的基本单元,是轻量级的进程,它们共享同一份代码和数据空间,但每个线程有自己的栈和程序...
Java多线程是Java编程中的重要概念,它允许程序同时执行多个任务,提高了程序的效率和响应速度。在Java中,我们可以通过实现Runnable接口或继承Thread类来创建线程。然而,直接使用线程可能存在一些问题,如资源管理...
Java多线程是Java编程中的一个重要概念,它允许程序同时执行多个任务,从而提高了程序的效率和响应速度。在Java中,多线程支持是语言级别的,这意味着开发者可以轻松地创建和管理并发执行的线程。 首先,我们要理解...
本文将深入探讨Java多线程模型的相关知识点,包括线程与进程的区别、线程的实现原理、线程的创建方法以及线程的阻塞与唤醒机制等,旨在为初学者提供一个清晰的多线程概念理解和使用指南。 一、线程与进程的区别 在...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提升系统效率。在本教程中,我们将深入探讨Java中的多线程设计模式、并发核心编程概念以及线程池的工作原理和种类。 首先,让我们了解什么...
本知识点将深入探讨Java多线程编程模板,帮助开发者理解和掌握如何在Java中创建、管理和同步线程。 一、线程的创建 在Java中,有两种主要的线程创建方式: 1. 继承Thread类:创建一个新的类,该类继承自Thread类,...
Java多线程是Java编程中的核心概念,它允许程序同时执行多个任务,从而提高应用程序的效率和响应性。本教程将深入讲解Java线程的相关知识,包括进程与线程的基本概念、线程的创建和启动、多线程的互斥与同步、线程...
【JAVA多线程探讨】 Java多线程是Java编程中不可或缺的一部分,特别是在处理并发和分布式系统时。在Java中,多线程允许程序同时执行多个不同的任务,从而提高应用程序的效率和响应性。本篇文章将深入探讨Java多线程...
Java多线程与并发编程是Java开发中至关重要的一部分,它涉及到如何高效地利用CPU资源,以实现程序的并行执行。在操作系统层面,多任务和多进程是通过分配不同的内存空间来实现的,而线程则共享同一进程的内存,这...
Java多线程是Java编程中不可或缺的部分,尤其在面试中,多线程的知识点经常被问及。本文将深入探讨Java多线程的核心概念、创建方式、线程状态转换、线程调度以及线程优先级调整。 首先,理解线程的基本概念至关重要...
### Java多线程学习资料知识点解析 #### 一、引言 Java作为一种广泛使用的编程语言,在并发编程领域具有独特的优势。多线程是Java中实现并发处理的核心技术之一,能够显著提升程序的性能和响应性。本文将深入探讨...
"Java多线程" Java多线程是Java语言中的一种编程方式,用于实现多任务的并发执行。Java多线程可以提高程序的效率和响应速度,使得程序更加灵活和高效。 进程与线程的概念: * 进程是操作系统管理的执行单位,多个...
### Java多线程知识点详解 #### 一、Java Thread 概念 在Java中,**线程**是一种轻量级的进程,它是程序执行流的最小单元。一个标准的Java应用通常至少包含一个线程,即主(Main)线程。Java支持多线程编程,这...
Java多线程教程详解 Java多线程是Java编程中不可或缺的一部分,它允许程序同时执行多个任务,提高程序效率和响应速度。理解并熟练运用Java的多线程机制是成为一个专业Java开发人员的关键技能。 一、线程的概念与...