java - 多线程

标签 java multithreading synchronization

题目如下:

三个线程同时启动如下:

t1.start();
t2.start();
t3.start();

第一个线程 (t1) 的输出应该是第二个线程 (t2) 的输入,第二个线程 (t2) 的输出应该是第三个线程 (t3) 的输入。

你能告诉我逻辑吗?

我知道我们可以使用对象的等待和通知方法。但是我可以获得实现此输出的算法或逻辑吗?

最佳答案

这是给你的帮助类。它在单例助手类中实现了两个资源锁。

让每个线程使用ResourceLock.getInstance()获取实例。让线程 2 调用 getResource1() 并等待线程 1 完成并将其输出放入 setResource1()。这释放了锁,线程二对 getResource1() 的调用返回。

重复线程 2 和 3

在没有超时的情况下调用挂起函数并不是一个好主意。因此有 10 秒的超时,根据您的需要进行编辑。

package com.madinsweden.test;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;


public class ResourceLock {

    protected static final int TIMEOUT = 10000; //ms

    private CountDownLatch mLock1;
    private CountDownLatch mLock2;

    private Object mObject1;
    private Object mObject2;

    private static ResourceLock mInstance;

    private ResourceLock() {
        mLock1 =  new CountDownLatch(1);
        mLock2 =  new CountDownLatch(1);
    }

    public static ResourceLock getInstance() {
        if (null == mInstance) {
            mInstance = new ResourceLock();
        }
        return mInstance;
    }


    public void setObject1(Object o) {
        mObject1 = o;
        mLock1.countDown();
    }

    public Object getResource1() {
        try {
            mLock1.await(TIMEOUT, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            throw new RuntimeException("Timeout of resource lock 1");
        }
        return mObject1;
    }


    public void setObject2(Object o) {
        mObject2 = o;
        mLock2.countDown();
    }

    public Object getResource2() {
        try {
            mLock2.await(TIMEOUT, TimeUnit.MILLISECONDS);
        } catch (InterruptedException e) {
            throw new RuntimeException("Timeout of resource lock 2");
        }
        return mObject2;
    }
}

关于java - 多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16602243/

相关文章:

authentication - CouchDB 和 PouchDB 之间的过滤同步

java - 无法映射我的 Spring Maven 项目的资源

java - 使用 Java kafka 客户端自定义分区

java - java线程缓存什么时候刷新?

java - Jersey 2.x 通过简单的 POST 调用(多线程)泄漏内存(终结器)

c# - 模拟 .NET 中的可等待计时器

java - 构造函数内的同步部分和同步构造函数的差异

java - 同步线程

java - 如何使用 Intent.ACTION_CALL 选择要调用的号码?

java - Java中与互斥体相关的问题