`
jeasonjack
  • 浏览: 50577 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA多线程---两个线程交替运行

阅读更多
/**
 * 两个线程交替执行,a线程打印123,b线程打印456 和打印次数,执行结果是123456 0 123456 1   123456 2 ......
 * @author shangjie
 *
 */
public class TwoThreadLock {

	private static Object LOCK = new Object();
	private static boolean flag = false;
	
	public static void main(String[] args) {

		Thread b = new Thread() {
			public void run() {
				for (int c = 0; c <= 100; c++) {
					synchronized (LOCK) {
						for (int i = 4; i <= 6; i++) {
							System.out.print(i);
						}
						System.out.print(" " + c);
						System.out.println();
						if(flag){
							flag = false;
							LOCK.notify();
							if (c < 100) {
								try {
									LOCK.wait();
									
								} catch (InterruptedException e) {
									e.printStackTrace();
								}
							}
							
						}
					}

				}
			}
		};

		Thread a = new Thread() {
			public void run() {
				for (int c = 0; c <= 100; c++) {
					synchronized (LOCK) {
						for (int i = 1; i <= 3; i++) {
							System.out.print(i);
						}
						if(!flag){
							flag = true;
							LOCK.notify();//在这里虽然唤醒了另一个线程b,但锁并没有释放
							if (c < 100) {
								try {
									LOCK.wait();//在wait后的瞬间线程b得到锁
									
								} catch (InterruptedException e) {
									e.printStackTrace();
								}
							}
							
						}
					}
				}
			}
		};

		a.start();
		b.start();
	}
}


package com.mfz.test;

public class TwoThread {

	private static Object lock = new Object();
	private static boolean flag = false;
	
	public static void main(String[] args) {
		
		Thread a = new Thread(){
			public void run()
			{
				while(true)
				{
					synchronized(lock)
					{
						System.out.println("Thread1");
						
						if(flag)
						{
							flag = false;
							lock.notify();
							try {
								lock.wait();
							} catch (InterruptedException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
						}
					}
					
					
				}
			}
		};
		
		Thread b = new Thread(){
			public void run()
			{
				while(true)
				{
					synchronized(lock)
					{
						System.out.println("Thread2");
						
						if(!flag)
						{
							flag =true;
							try {
								lock.notify();
								lock.wait();
							} catch (Exception e) {
								// TODO: handle exception
								e.printStackTrace();
							}
						}
					}
					
					
				}
			}
		};
		
		a.start();
		b.start();
	}
}
0
8
分享到:
评论
2 楼 jeasonjack 2014-06-24  
zy52178580 写道
版主您好:
  想问下程序中flag的作用 拿掉可以么谢谢额

不可以,标识作用。
1 楼 zy52178580 2014-06-03  
版主您好:
  想问下程序中flag的作用 拿掉可以么谢谢额

相关推荐

    JAVA线程高级-线程按序交替执行

    - `Exchanger`则允许两个线程交换数据,每次只有一个线程可以完成交换,从而实现交替执行。 4. **线程间的通信**: - `wait()`, `notify()`, `notifyAll()`是Object类的方法,用于线程间的通信。一个线程调用`...

    Java多线程-多线程知识点总结和企业真题

    ### Java多线程知识点总结及企业真题解析 #### 一、知识点总结 ##### (1)多线程相关概念 1. **程序、进程和线程的区分**: - **程序**:为了完成特定的任务而编写的指令集合。它是静态的概念。 - **进程**:...

    Java多线程-线程间的通信

    案例描述:使用两个线程交替打印数字1-100。 **分析**: 1. **创建线程**:使用实现Runnable接口的方式来创建线程。 2. **解决线程安全问题**:由于两个线程需要共享同一个计数器变量`number`,因此需要对计数器的...

    彻底明白Java的多线程-线程间的通信.doc

    因此,尽管两个线程都在运行,但它们都在同一个CPU核心上交替执行,导致看似只有一个线程在工作。为了实现真正的并发,我们需要使用更复杂的同步机制,如线程同步或线程间通信。 接着,我们来看如何在Java中实现多...

    多线程 打印1-99,100-199

    根据实验需求,我们需要创建两个子线程,分别打印从 1 到 99 和从 100 到 199 的数字,并且这两个线程需要交替打印数字。 **3.1 创建打印线程** 首先,我们创建两个类 `Test1` 和 `Test2` 来代表两个子线程,它们...

    多线程-day01.docx

    在 Java 中,多线程是并发编程的重要概念,它允许程序同时执行多个任务,从而提高系统效率和资源利用率。在本教程中,我们将探讨多线程的基础知识,包括并发与并行的区别,进程与线程的概念,以及如何在 Java 中创建...

    java多线程机制 -- 源码详解

    主类Example1创建了两个线程,lefthand和righthand,分别由Lefthand和Righthand类的实例化对象代表。每个线程通过调用start()方法启动,并执行各自run()方法中的代码。输出结果展示了线程之间的交替执行,这得益于...

    java多线程源码,仅供参考

    这个名为"java多线程源码,仅供参考"的压缩包文件,显然是为了帮助学习者深入理解Java多线程的运行机制。其中的示例程序"BounceThread"可能是一个演示线程交互和同步的经典案例,常用于教授线程的创建、运行以及线程...

    Java多线程程序设计-JSP教程,Java技巧及代码

    Java多线程程序设计是Java开发中的重要概念,它允许在一个程序中同时执行多个任务,提高了应用程序的效率和响应性。在Java中,有两种主要的方式来实现多线程:继承Thread类和实现Runnable接口。 首先,我们要理解多...

    JAVA多线程编程详解-详细操作例子(转自CSDN)

    Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提升程序的效率和响应性。本文将详细解析Java中实现多线程的两种主要方式,并讨论线程的基本概念和内存模型。 首先,理解多线程的概念至关...

    Java多线程实例图形版

    总结起来,"Java多线程实例图形版"是一个结合理论与实践的教学资源,通过“哲学家就餐问题”这一经典案例,帮助开发者理解多线程的基本概念、并发问题以及解决策略。通过学习这个实例,不仅可以掌握Java多线程编程的...

    java 多线程制作动画

    例如,如果两个线程需要交替进行(半径变化后圆心移动,或反之),可以使用wait()和notify()来实现线程间的协作。线程安全的数据结构,如Atomic类,也可以用来在多线程环境下共享和修改数据。 在控制半径大小的线程...

    java核心基础之多线程-毕向东.doc

    在一个单核CPU中,看似多个线程同时运行,实际上是在快速交替执行。在多核CPU中,每个核可以同时执行一个线程,从而真正实现并行执行。 为了更好地控制线程,Java提供了`Thread`类的一些方法,如`currentThread()`...

    我总结的Java多线程程序设计

    Java多线程程序设计是Java开发中的重要组成部分,它允许程序在同一时间执行多个任务,从而提高了系统的效率和响应性。本文将深入探讨Java多线程的相关概念和实现方式。 一、理解多线程 1. **线程定义**:线程是一...

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

    Java多线程是Java语言中的一个重要特性,它允许程序同时执行多个不同的任务,从而提高程序的效率和响应性。在操作系统层面,实现并发最常见的方式是通过进程和线程。进程是具有独立内存空间的执行单元,而线程是进程...

    java语言学习-04 线程.pdf

    预期输出结果为两个线程交替打印数字和带有描述的数字,但由于线程调度的不确定性,实际输出结果可能不会严格按照预期的顺序出现。 ### 总结 本章介绍了Java中的线程概念以及线程的基本创建方法。理解进程与线程...

    Java多线程的小例子——吃包子

    这个名为"Java多线程的小例子——吃包子"的示例,旨在帮助开发者直观地理解多线程的工作原理。下面我们将深入探讨该示例所涉及的核心知识点。 首先,多线程通常涉及到以下几个关键概念: 1. **线程(Thread)**:...

    java 两个线程相互顺序输出

    标题“java 两个线程相互顺序输出”涉及的问题是如何在多线程环境下控制线程的执行顺序,使得两个线程可以按照特定的顺序交替打印输出。这通常涉及到线程同步和通信的概念。下面将详细解释这些知识点。 1. **线程...

    java多线程编程大总结

    Java多线程编程是Java语言中的一个重要组成部分,它允许程序在单个进程内同时执行多个线程,从而实现多任务处理。在Java 5版本之前,Java对多线程的支持相对有限,编写复杂的多线程程序具有一定的挑战性。然而,从...

    Java多线程相关知识总结

    - JVM启动时会初始化至少两个线程:一个是**主线程**,用于执行`main`方法;另一个是**垃圾回收线程**,负责管理内存。 - 在Java程序中,所有线程共享同一个JVM实例,这意味着它们共享相同的堆内存和方法区,但...

Global site tag (gtag.js) - Google Analytics