/**
* 两个线程交替执行,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();
}
}
分享到:
相关推荐
- `Exchanger`则允许两个线程交换数据,每次只有一个线程可以完成交换,从而实现交替执行。 4. **线程间的通信**: - `wait()`, `notify()`, `notifyAll()`是Object类的方法,用于线程间的通信。一个线程调用`...
### Java多线程知识点总结及企业真题解析 #### 一、知识点总结 ##### (1)多线程相关概念 1. **程序、进程和线程的区分**: - **程序**:为了完成特定的任务而编写的指令集合。它是静态的概念。 - **进程**:...
案例描述:使用两个线程交替打印数字1-100。 **分析**: 1. **创建线程**:使用实现Runnable接口的方式来创建线程。 2. **解决线程安全问题**:由于两个线程需要共享同一个计数器变量`number`,因此需要对计数器的...
因此,尽管两个线程都在运行,但它们都在同一个CPU核心上交替执行,导致看似只有一个线程在工作。为了实现真正的并发,我们需要使用更复杂的同步机制,如线程同步或线程间通信。 接着,我们来看如何在Java中实现多...
根据实验需求,我们需要创建两个子线程,分别打印从 1 到 99 和从 100 到 199 的数字,并且这两个线程需要交替打印数字。 **3.1 创建打印线程** 首先,我们创建两个类 `Test1` 和 `Test2` 来代表两个子线程,它们...
在 Java 中,多线程是并发编程的重要概念,它允许程序同时执行多个任务,从而提高系统效率和资源利用率。在本教程中,我们将探讨多线程的基础知识,包括并发与并行的区别,进程与线程的概念,以及如何在 Java 中创建...
主类Example1创建了两个线程,lefthand和righthand,分别由Lefthand和Righthand类的实例化对象代表。每个线程通过调用start()方法启动,并执行各自run()方法中的代码。输出结果展示了线程之间的交替执行,这得益于...
这个名为"java多线程源码,仅供参考"的压缩包文件,显然是为了帮助学习者深入理解Java多线程的运行机制。其中的示例程序"BounceThread"可能是一个演示线程交互和同步的经典案例,常用于教授线程的创建、运行以及线程...
Java多线程程序设计是Java开发中的重要概念,它允许在一个程序中同时执行多个任务,提高了应用程序的效率和响应性。在Java中,有两种主要的方式来实现多线程:继承Thread类和实现Runnable接口。 首先,我们要理解多...
Java多线程编程是Java开发中的重要组成部分,它允许程序同时执行多个任务,提升程序的效率和响应性。本文将详细解析Java中实现多线程的两种主要方式,并讨论线程的基本概念和内存模型。 首先,理解多线程的概念至关...
总结起来,"Java多线程实例图形版"是一个结合理论与实践的教学资源,通过“哲学家就餐问题”这一经典案例,帮助开发者理解多线程的基本概念、并发问题以及解决策略。通过学习这个实例,不仅可以掌握Java多线程编程的...
例如,如果两个线程需要交替进行(半径变化后圆心移动,或反之),可以使用wait()和notify()来实现线程间的协作。线程安全的数据结构,如Atomic类,也可以用来在多线程环境下共享和修改数据。 在控制半径大小的线程...
在一个单核CPU中,看似多个线程同时运行,实际上是在快速交替执行。在多核CPU中,每个核可以同时执行一个线程,从而真正实现并行执行。 为了更好地控制线程,Java提供了`Thread`类的一些方法,如`currentThread()`...
Java多线程程序设计是Java开发中的重要组成部分,它允许程序在同一时间执行多个任务,从而提高了系统的效率和响应性。本文将深入探讨Java多线程的相关概念和实现方式。 一、理解多线程 1. **线程定义**:线程是一...
Java多线程是Java语言中的一个重要特性,它允许程序同时执行多个不同的任务,从而提高程序的效率和响应性。在操作系统层面,实现并发最常见的方式是通过进程和线程。进程是具有独立内存空间的执行单元,而线程是进程...
预期输出结果为两个线程交替打印数字和带有描述的数字,但由于线程调度的不确定性,实际输出结果可能不会严格按照预期的顺序出现。 ### 总结 本章介绍了Java中的线程概念以及线程的基本创建方法。理解进程与线程...
这个名为"Java多线程的小例子——吃包子"的示例,旨在帮助开发者直观地理解多线程的工作原理。下面我们将深入探讨该示例所涉及的核心知识点。 首先,多线程通常涉及到以下几个关键概念: 1. **线程(Thread)**:...
标题“java 两个线程相互顺序输出”涉及的问题是如何在多线程环境下控制线程的执行顺序,使得两个线程可以按照特定的顺序交替打印输出。这通常涉及到线程同步和通信的概念。下面将详细解释这些知识点。 1. **线程...
Java多线程编程是Java语言中的一个重要组成部分,它允许程序在单个进程内同时执行多个线程,从而实现多任务处理。在Java 5版本之前,Java对多线程的支持相对有限,编写复杂的多线程程序具有一定的挑战性。然而,从...
- JVM启动时会初始化至少两个线程:一个是**主线程**,用于执行`main`方法;另一个是**垃圾回收线程**,负责管理内存。 - 在Java程序中,所有线程共享同一个JVM实例,这意味着它们共享相同的堆内存和方法区,但...