0 0

关于多线程问题,signalAll,await问题3

 

package ThreadTest;

 

import java.util.concurrent.TimeUnit;

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

 

public class AwaitTest1 extends Thread{

private final Lock lock = new ReentrantLock();

private Condition waitCondition = lock.newCondition();

public static void main(String[] args) throws InterruptedException {

new AwaitTest1().threads();

}

public void threads() throws InterruptedException {

Thread t1 = new Thread(){

public void run(){

try {

lock.lock();

System.out.println("do somthing xxx long time");

waitCondition.signalAll();

System.out.println("sign other");

Thread.sleep(500);

lock.unlock();

} catch (InterruptedException e) {

e.printStackTrace();

}

}

};

Thread t2 = new Thread(){

public void run(){

System.out.println(waitResult());

}

};

t1.start();

t2.start();

}

public Boolean waitResult() {

System.out.println("x");

lock.lock();

Boolean result = false;

try {

System.out.println("y");

result = waitCondition.await(1000, TimeUnit.MILLISECONDS);

} catch (InterruptedException e) {

e.printStackTrace();

}

lock.unlock();

return result;

}

}

 

说下我写这个目的,我也是才学学习多线程,在此遇到了不少问题,我本来想些个异步的通信 就是说当我运行线程T1的时候,他唤醒T2,就像是Future那个异步回调,但是不知道该如何写,也不知道这个result什么时候返回true,我感觉是当线程T1完成复杂的计算后,然后在await在没有超时的情况下,会返回为true,但是现在我程序写的有问题,请各位帮忙解决下,谢谢


2011年9月26日 10:41

1个答案 按时间排序 按投票排序

0 0

采纳的答案

要想获得你预期的结果,就必须是
t2先获得锁(lock.lock()),然后执行 waitCondition.await,释放锁并等待信号;t1获得锁执行完相关操作后执行waitCondition.signalAll,t2从而获得锁继续执行,此时如果等待时间未超时就返回true.
await时间应该比t1执行时间长。


import java.util.concurrent.TimeUnit;

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

public class AwaitTest {

	private final Lock lock = new ReentrantLock();

	private Condition waitCondition = lock.newCondition();

	public static void main(String[] args) throws InterruptedException {

		new AwaitTest().threads();

	}

	public void threads() throws InterruptedException {
		final Thread t1 = new Thread() {
			public void run() {
				try {
					lock.lock();
					System.out.println("do somthing...");
					Thread.sleep(1000);
					waitCondition.signal();
				} catch (InterruptedException e) {
					e.printStackTrace();
				} finally {
					lock.unlock();
				}
			}
		};

		Thread t2 = new Thread() {
			public void run() {
				
				System.out.println(waitResult());
				
			}
		};
		

		t2.start();
		//保证t2先开始
		Thread.sleep(1000);
		t1.start();
	}

	public boolean waitResult() {
		boolean result = false;
		lock.lock();
		try {
			result = waitCondition.await(3000, TimeUnit.MILLISECONDS);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
		return result;
	}

}

2011年9月26日 11:28

相关推荐

    Java线程中wait,await,sleep,yield,join用法总结.pdf

    在Java编程中,多线程的使用是实现程序并发运行的重要手段。本文将总结五个关键的线程控制方法:...同时,使用时需特别注意这些方法中隐含的线程安全问题和锁的释放机制,这直接关系到多线程程序运行的正确性和效率。

    Java的多线程-线程间的通信.doc

    在实际开发中,正确使用这些线程通信机制可以避免数据不一致、死锁等问题,确保多线程程序的正确性和效率。例如,在生产者-消费者模型或读者-写者问题中,线程间的通信是解决并发问题的关键。因此,理解并熟练掌握...

    多线程编程的核心思想.doc

    ABA 问题是指在多线程环境下,一个线程在读取变量时,另外一个线程修改了变量的值。解决方案是使用 volatile 关键字或 Lock 接口。 十二、并发容器 并发容器是指可以在多线程环境下安全使用的容器。Java 中的 ...

    java经典多线程面试题

    - 使用Condition接口提供的await()、signal()和signalAll()方法在java.util.concurrent.locks包中的实现类也可以实现线程间的通信。 10. Java中的并发集合类有哪些? - java.util.concurrent包中提供了一些线程...

    ConditionVariablesJAVA多线程[定义].pdf

    在Java多线程编程中,通过结合Lock和Condition接口,可以灵活地实现条件变量,并解决更复杂的多线程协作问题。特别是在实现生产者-消费者模式、读者-写者模式等经典的同步问题时,条件变量提供了一种有效的解决方案...

    java多线程核心编程技术

    ### Java多线程核心编程技术 #### 一、Java多线程基础 ##### 1.1 线程的概念 在计算机科学中,线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。在Java中,通过创建`...

    java多线程系列(四)ReentrantLock的使用.docx

    Java中的多线程编程在处理并发问题时是至关重要的,特别是在高并发环境下,对资源的精确控制成为提高系统效率的关键。本篇文章将深入探讨`ReentrantLock`的使用,它是Java并发包`java.util.concurrent.locks`中的一...

    Java学习资料-详解Condition的await和signal等待/通知机制

    在Java多线程编程中,`Condition`是Java并发包`java.util.concurrent.locks`中的一个接口,它提供了比`Object`类中的`wait()`、`notify()`和`notifyAll()`更加灵活和强大的线程间通信机制。`Condition`与`Lock`配合...

    Java多线程实战之交叉打印的两种方法

    下面是使用await()和signalAll()方法实现Java多线程实战之交叉打印的代码示例: ```java public class MyService { private Lock lock = new ReentrantLock(); private Condition condition = lock.newCondition...

    上传文件时,线程一直waiting

    总的来说,解决“上传文件时,线程一直waiting”的问题需要深入理解多线程编程原理,熟悉Java的并发工具,并能有效地利用线程监控工具进行排查。通过对代码的审查和问题重现,通常可以定位到导致线程等待的具体原因...

    Java多线程中ReentrantLock与Condition详解

    Java多线程中ReentrantLock与Condition详解 ReentrantLock是Java多线程中一种高级的锁机制,它实现了Lock接口,提供了与synchronized相同的并发性和内存语义,但添加了一些特性,如锁投票、定时锁等候和可中断锁...

    java并发之线程间通信协作.docx

    在Java并发编程中,线程间通信协作是一个关键的概念,特别是在多线程环境中,如生产者-消费者模型。这个模型中,生产者线程负责生产数据并放入队列,而消费者线程则负责取出并消费这些数据。为了保证数据的安全和...

    线程整理1

    以下是一些关于多线程的重要知识点,结合提供的标题、描述和标签进行详细阐述: 1. **多线程共享消息队列**: 在并发环境中,线程间通信常常依赖于消息队列。`RequestQueue.java`的例子中,通过`wait()`方法,线程...

    Java多线程编程中使用Condition类操作锁的方法详解

    在Java多线程编程中,Condition类是Java并发包`java.util.concurrent.locks`中的一个核心组件,它提供了比传统`synchronized`关键字更细粒度的锁控制机制。Condition允许我们创建独立的等待集合,这使得线程可以更加...

    java 资源搜索并下载(线程等待和通报)

    这个主题涉及到多线程、网络I/O以及同步机制等核心概念。本文将深入探讨如何使用Java进行资源搜索与下载,同时结合线程等待和通报机制来优化程序性能。 一、资源搜索 资源搜索通常涉及HTTP请求,通过URL连接到...

    nachos-lab 02

    完成这个实验将有助于深入理解多线程编程中的同步问题和解决策略,这对于开发高效、可靠的并发程序至关重要。在实际编码过程中,除了实现功能外,还需要进行充分的测试,确保在各种并发场景下程序的行为都符合预期。...

    Java面试题线程部分.docx

    线程间的通信通常通过wait、notify、notifyAll、await、signal和signalAll等方法实现,确保线程之间的协作和资源的有序访问。线程同步和互斥是并发编程中的重要概念,互斥是指对共享资源的独占访问,同步则是控制多...

    还讲生产者与消费者(condition)

    标题中的“生产者与消费者(condition)”是指在多线程编程中的一个经典问题,它涉及到如何高效地协调生产数据和消费数据的线程。在计算机科学中,生产者是生成数据的线程,而消费者则是使用这些数据的线程。这个问题...

    Java基础学习60.pdf

    本资源涵盖了Java基础知识,特别是多线程安全问题的解决方法,这对于理解和编写高效、可靠的并发程序至关重要。以下是相关知识点的详细说明: 1. **多线程安全问题**: 当多个线程访问共享的成员变量或静态变量时...

Global site tag (gtag.js) - Google Analytics