0 0

多线程互相唤醒20

4个线程,1执行结束唤醒2,然后1进入睡眠...4结束唤醒1 如此循环。要求每个线程中的run方法中的代码只执行完整的一次。1分钟循环这4个线程一次。该怎么办
2008年7月31日 17:24

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

0 0

你用线程池多方便啊,可以自己控制.没有用的线程会放到池子中,还可以节省资源

2008年8月11日 23:39
0 0

创建四个线程,2,3,4线程开始就wait。1运行结束就notify 线程2。
每次运行的时候判断前一次运行时间和这次运行时间的时间差。

import java.util.Date;

/**
 * @author jolestar
 * 
 */
public class ThreadTest {

    /**
     * 
     */
    public ThreadTest() {
    }

    private static class TestThread extends Thread {
	private Thread next;
	//前一次运行时间
	private long preRuntime =0;

	public TestThread(String name, Thread next) {
	    super(name);
	    this.next = next;
	}
	
	public void setNext(Thread next){
	    this.next = next;
	}
	
	@Override
	public void run() {
	    synchronized (this) {
		    try {
			this.wait();
		    } catch (InterruptedException e) {
			e.printStackTrace();
		    }
		}
	    while (true) {
		//前一次运行是否经过了1分钟
		if((System.currentTimeMillis()-this.preRuntime)<60*1000){
		    long time = 60*1000-(System.currentTimeMillis()-this.preRuntime);
		    System.out.println("need to sleep:"+time);
		    try {
			this.sleep(time);
		    } catch (InterruptedException e) {
			e.printStackTrace();
		    }
		}
		
		dosomething();
		synchronized (this.next) {
		    this.next.notify();
		}
		synchronized (this) {
		    try {
			this.wait();
		    } catch (InterruptedException e) {
			e.printStackTrace();
		    }
		}
	    }
	}

	public void dosomething() {
	    Date date = new Date();
	    preRuntime = date.getTime();
	    System.out.println(this.getName() + " do some thing."+date.toString());
	}

    }

    /**
     * @param args
     */
    public static void main(String[] args) {
	TestThread t1 = new TestThread("1",null);
	TestThread t2 = new TestThread("2",null);
	t1.setNext(t2);
	
	TestThread t3 = new TestThread("3",null);
	t2.setNext(t3);
	
	TestThread t4 = new TestThread("4",t1);
	t3.setNext(t4);
	
	t1.start();
	t2.start();
	t3.start();
	t4.start();
	
	System.out.println("notify t1");
	synchronized (t1) {
	    t1.notify();
	}
	
    }

}

2008年8月05日 17:45

相关推荐

    41.线程间的通信-wait与notify-只唤醒一个线程或所有线程.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    java 多线程并发实例

    例如,死锁发生在两个或更多线程互相等待对方释放资源,导致它们都无法继续的情况。避免死锁的方法包括避免循环等待、设置超时和使用死锁检测算法等。 总之,Java的多线程并发实例可以帮助我们更好地理解和实践线程...

    CC++多线程编程练习题大全

    **CC++多线程编程**是现代软件开发中的重要组成部分,尤其在高性能计算、服务器端应用和实时系统中,多线程技术能充分利用多核处理器的资源,提高程序的执行效率。以下是一些关于CC++多线程编程的核心知识点: 1. *...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例).rar

    - 死锁是多线程编程中常见的问题,多个线程互相等待对方释放资源导致无法继续执行。理解和避免死锁是多线程编程的必备技能。 以上知识点是C#.NET多线程实例中可能会涉及到的核心内容,通过学习这些实例,开发者...

    C#.NET多线程实例6个(包括多线程基本使用,多线程互斥等全部多线程使用实例)_26.rar

    9. **死锁和活锁**:在多线程编程中,死锁是指两个或多个线程互相等待对方释放资源而造成的一种僵局。活锁则是线程不断尝试但无法取得进展的情况。理解并避免这些情况对于编写健壮的多线程程序至关重要。 10. **...

    C++多线程demo

    当两个或更多线程互相等待对方释放资源时,就会发生死锁。避免死锁的关键是遵循一些原则,如避免循环等待,使用超时和死锁预防算法等。 8. **线程安全**: 如果一个函数在多线程环境下正确工作,我们就说它是线程...

    Java多线程技术精讲

    死锁是多线程编程中常见的问题,当两个或更多线程互相等待对方释放资源而无法继续执行时,就会发生死锁。Java提供了一些工具来避免和检测死锁,例如java.util.concurrent包下的Lock接口和Condition接口,它们提供了...

    C#多线程编程实战Code源代码

    多线程编程中可能出现死锁和活锁问题,死锁是两个或更多线程互相等待对方释放资源导致的僵局,活锁则是线程不断重试导致无法继续执行。识别和避免这些问题是多线程编程的关键挑战。 以上知识点在提供的源代码中都有...

    java 多线程课件

    死锁是多线程中的一种危险情况,当两个或更多线程互相等待对方释放资源时发生。例如,哲学家进餐问题就是一个经典的死锁示例。为了避免死锁,开发者需要谨慎设计资源的获取和释放顺序,或者使用更高级的并发工具,如...

    多线程之间通讯5.rar

    8. **死锁(Deadlock)**:当两个或更多线程互相等待对方释放资源而无法继续执行时,就形成了死锁。避免和检测死锁是多线程编程中的重要课题。 9. **活锁(Livelock)**:与死锁类似,但线程不是完全停止,而是不断...

    java多线程基础资料

    6. 死锁:当两个或更多线程互相等待对方释放资源而无法继续执行时,就会发生死锁。避免死锁的关键在于避免循环等待条件。 7. 线程中断:Java提供了interrupt()和isInterrupted()方法来中断和检测线程。但需要注意的...

    C#多线程开发之并发编程经典实例.zip

    11. **死锁与活锁**:死锁是两个或更多线程互相等待对方释放资源,造成无法继续的情况;活锁则是线程不断重试导致无法前进。避免这些情况需要合理设计线程同步策略。 12. **线程异常处理**:主线程不会捕获子线程的...

    java多线程测试实例

    - 当两个或更多线程互相等待对方释放资源而形成的一种僵局,需要通过避免循环等待或使用死锁检测算法来预防。 9. **线程安全的数据结构** - Java并发包`java.util.concurrent`提供了线程安全的集合类,如`...

    多线程控制红绿灯变化

    死锁是当两个或更多线程互相等待对方释放资源而造成的僵局。合理的资源分配和锁的使用策略可以预防死锁。 7. **线程优先级**:某些编程语言允许设置线程的优先级,但在这个场景中可能并不适用,因为红绿灯的切换...

    Java多线程编程模板

    当两个或更多线程互相等待对方释放资源而形成的一种僵局,称为死锁。避免死锁的关键是避免循环等待,可以使用银行家算法或Java的java.util.concurrent.locks包中的高级锁来预防。 七、线程安全的数据结构 Java集合...

    VC++实现多线程支持多人同时聊天的QQ聊天源代码

    3. **并发处理**:当有多个用户同时发送消息时,多线程可以保证每个消息的处理不会互相干扰,提高系统的并行处理能力。 4. **资源管理**:通过合理分配线程,我们可以优化CPU和内存的使用,防止单一线程过度消耗...

    C++ 多线程综合技术篇

    在C++编程中,多线程技术是一种关键的并发处理机制,它允许程序同时执行多个独立的任务,从而提高系统的效率和响应性。本综合技术篇将深入探讨C++中的多线程概念、实现方法以及常见问题。 一、线程基础 线程是操作...

    java多线程编程

    当两个或更多线程互相等待对方释放资源时,会发生死锁。避免死锁的关键是避免循环等待,可以通过资源排序、避免嵌套锁等策略来预防。 5. **线程优先级** Java线程具有优先级,`Thread.NORM_PRIORITY`是默认优先级...

    java 多线程高并发相关资料收集

    死锁发生在两个或多个线程互相等待对方释放资源,导致它们都无法继续执行。活锁则是线程不断地重试,但没有进展,就像两个人在狭小的空间里试图通过,但都让对方先走。为了避免这些情况,我们需要合理设计资源的获取...

    多线程Demo

    1. **死锁**:两个或更多线程互相等待对方释放资源,形成无法继续执行的状态。避免死锁的关键是正确设计资源获取顺序和避免循环等待。 2. **活锁**:线程不断尝试获取资源但一直失败,导致线程无限期地循环,无法...

Global site tag (gtag.js) - Google Analytics