首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么这个线程(WriteData)不能执行它的功能?

为什么这个线程(WriteData)不能执行它的功能?
EN

Stack Overflow用户
提问于 2018-08-17 15:26:15
回答 1查看 37关注 0票数 1

我正在练习信号量类,我已经创建了两个线程,一个在“共享”类中将数据写入HashMap,另一个从共享类中读取数据。

所以我的问题是,当我读取数据时,它只显示之前在共享类中添加的数据,而不是更新的数据。我不知道我迷失在哪里了。

我是否应该从"Writedata“类中读取,如果是,线程如何返回HashMap。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Shared {

    Map<String, Integer> hashmap = new HashMap<String, Integer>();
    {
        hashmap.put("kishore", 797979);
        hashmap.put("nanesg", 8768787);
        hashmap.put("mahesh", 842803);
        hashmap.put("srikar", 7979980);
    }

    public void puthash(String name, Integer in, Map<String, Integer> hashmap) {
        hashmap.put(name, in);
    }

    public Map<String, Integer> gethash() {
        return this.hashmap;
    }

}

class ReadHashMap implements Runnable {

    Semaphore sem;
    String name;
    Shared shared = new Shared();

    ReadHashMap(Semaphore sem, String name) {
        this.sem = sem;
        this.name = name;

        new Thread(this, name).start();

    }

    public void run() {
        try {
            System.out.println(Thread.currentThread().getName() + " Thread trying to acquiring the permit ");
            sem.acquire();
            System.out.println(Thread.currentThread().getName() + " Thread acquires the permit ");
            Map<String, Integer> hashmap = shared.gethash();
            Set<Entry<String, Integer>> set = hashmap.entrySet();
            System.out.println("reading data in hashmap, Here is the data: ");
            for (Map.Entry<String, Integer> mp : set) {

                System.out.println(mp.getKey() + "  : " + mp.getValue());
            }

        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            System.out.println(Thread.currentThread().getName() + " Thread relesing the permit ");
            sem.release();
        }

    }
}

class WriteData implements Runnable {

    Semaphore sem;
    String name;
    Shared shared = new Shared();

    WriteData(Semaphore sem, String name) {
        this.sem = sem;
        this.name = name;
        new Thread(this, name).start();

    }

    public void run() {
        try {
            System.out.println(Thread.currentThread().getName() + "Thread trying to get permit");
            sem.acquire();
            Map<String, Integer> hashmap = shared.gethash();
            System.out.println(Thread.currentThread().getName() + " Thread acquires the permit ");
            shared.puthash("added1", 98799, hashmap);
            shared.puthash("added2", 987989, hashmap);
            shared.puthash("added3", 98979, hashmap);

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + " Thread relesing the permit ");
        sem.release();
    }
}

public class SemaphoreDemo {
    public static void main(String args[]) {
        Semaphore sem = new Semaphore(1);

        new WriteData(sem, "write");
        new ReadHashMap(sem, "read");
    }
}

下面是它的输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
writeThread trying to get permit
read Thread trying to acquiring the permit 
write Thread acquires the permit 
write Thread relesing the permit 
read Thread acquires the permit 
reading data in hashmap, Here is the data: 
nanesg  : 8768787
mahesh  : 842803
kishore  : 797979
srikar  : 7979980
read Thread relesing the permit 

为什么WriteData线程(特别是函数)没有添加数据。这个函数有什么问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-17 15:36:01

因为您在ReadHashMapWriteData中创建了不同的Shared实例。

解决方案

使用相同的Shared

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class ReadHashMap implements Runnable {

    Semaphore sem;
    String name;
    Shared shared;

    ReadHashMap(Semaphore sem, String name, Shared shared) {
        this.sem = sem;
        this.name = name;
        this.shared = shared;
        new Thread(this, name).start();
    }
    ....
}

class WriteData implements Runnable {

    Semaphore sem;
    String name;
    Shared shared;

    WriteData(Semaphore sem, String name, Shared shared) {
        this.sem = sem;
        this.name = name;
        this.shared = shared;
        new Thread(this, name).start();
    }

    ....
}

public class SemaphoreDemo {
    public static void main(String args[]) {
        Semaphore sem = new Semaphore(1);
        Shared shared = new Shared();

        new WriteData(sem, "write", shared);
        new ReadHashMap(sem, "read", shared);
    }
}

结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
writeThread trying to get permit
write Thread acquires the permit 
read Thread trying to acquiring the permit 
write Thread relesing the permit 
read Thread acquires the permit 
reading data in hashmap, Here is the data: 
nanesg  : 8768787
mahesh  : 842803
kishore  : 797979
added2  : 987989
added3  : 98979
srikar  : 7979980
added1  : 98799
read Thread relesing the permit 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51898576

复制
相关文章
GPU随机采样速度比较
随机采样问题,不仅仅只是一个统计学/离散数学上的概念,其实在工业领域也都有非常重要的应用价值/潜在应用价值,具体应用场景我们这里就不做赘述。本文重点在于在不同平台上的采样速率,至于另外一个重要的参数检验速率,这里我们先不做评估。因为在Jax中直接支持vmap的操作,而numpy的原生函数大多也支持了向量化的运算,两者更像是同一种算法的不同实现。所以对于检验的场景,两者的速度区别更多的也是在硬件平台上。
DechinPhy
2021/12/10
3610
Excel公式技巧40: 对数据随机排序
有时候,为公平起见,我们会将一组数据随机排序。如下图1所示,在列D中对列C中的数据随机排序。
fanjy
2020/07/29
5.1K0
Excel公式技巧40: 对数据随机排序
关于随机数生成的速度测试
随机数生成有两种方法,一种是主机上生成拷贝到设备上,另一种是直接主机上调用,在设备上生成:下面就是关于这两种方法的速度测试: int main(){ clock_t start,finish; int *d_data; int m = 1000; CUDA_CALL(cudaMalloc((void **)&d_data, m*sizeof(int))); int rand1[1000]; start = clock(); memset(ra
用户1154259
2018/01/17
1K0
矢量函数
一个由三个变量组成的函数w = f(x,y,z)表示如何根据x,y,z来确定w的值。从几何角度更有利于对这个概念的理解:在空间笛卡尔坐标系下取一点,坐标为(x,y,z),函数w = f(x,y,z)告诉我们如何将一个点和一个数联系起来。例如:一个函数T(x,y,z)可以表明空间任意一点的温度。 以上提到的函数f(x,y,z)和T(x,y,z)是标量函数,即在函数T(x,y,z)中给x,y,z赋值得到的结果是温度,温度是标量。矢量函数的一般形式简单明了。在三维空间中的一个矢量函数是一个将每个点(x,y,z)和
fem178
2018/04/08
3.8K0
矢量函数
JS基础测试: 单选 下列随机数公式中正确的是
Math.random() 函数返回一个浮点, 伪随机数在范围[0,1),也就是说,从0(包括0)往上,但是不包括1(排除1),然后可以缩放到所需的范围。
舒克
2019/08/19
1.7K0
【学习】请速度收藏,Excel常用电子表格公式大全
1、查找重复内容公式:=IF(COUNTIF(A:A,A2)>1,”重复”,””)。 2、用出生年月来计算年龄公式:=TRUNC((DAYS360(H6,”2009/8/30″,FALSE))/360,0)。 3、从输入的18位身份证号的出生年月计算公式:=CONCATENATE(MID(E2,7,4),”/”,MID(E2,11,2),”/”,MID(E2,13,2))。 4、从输入的身份证号码内让系统自动提取性别,可以输入以下公式: =IF(LEN(C2)=15,IF(MOD(MID(C2,15
小莹莹
2018/04/18
2.9K0
Excel实战技巧104:使用Excel公式创造一个随机句子
有两种方法可以用来创造随机句:使用Excel365中的动态数组,或者老版本Excel中的常规函数。
fanjy
2021/06/01
1.8K0
【算法】粒子群算法Particle Swarm Optimization超详细解析+代码实例讲解
粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解。
短短的路走走停停
2019/05/13
93.1K8
【算法】粒子群算法Particle Swarm Optimization超详细解析+代码实例讲解
用 Wolfram 语言分析随机运动粒子群的角速度分布
1. 该代码可在Mathematica 13.1.0.0(TraditionalForm)下正确运行。
WolframChina
2022/12/02
3590
用 Wolfram 语言分析随机运动粒子群的角速度分布
Excel公式技巧19: 在方形区域内填充不重复的随机整数
本文分享一个基于公式生成n×n随机整数的解决方案,并且每个整数都是唯一的。例如,下图1显示了生成10行10列的不重复随机整数。
fanjy
2020/03/16
1.1K0
pso粒子群优化算法_粒子群算法优化神经网络
粒子群优化算法(PSO)是一种进化计算技术(evolutionary computation),1995 年由Eberhart 博士和kennedy 博士提出,源于对鸟群捕食的行为研究 。该算法最初是受到飞鸟集群活动的规律性启发,进而利用群体智能建立的一个简化模型。粒子群算法在对动物集群活动行为观察基础上,利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程,从而获得最优解。
全栈程序员站长
2022/09/27
7440
矢量数据投影转换
接着上一篇博文中,我们得到了WGS84坐标系下的中国省区图,而我们一般中国地图中使用的是割圆锥投影。
卡尔曼和玻尔兹曼谁曼
2019/01/22
1.8K0
矢量数据的处理
  矢量数据就是点、线、面和注记,不能是栅格,也不能是TIN等数据,矢量数据的处理和分析基本原理如下。
小孙同学
2022/01/17
2.1K0
矢量数据的处理
理解距离矢量路由
1 常用的距离矢量路由:IP RIP、IGRP等等 2 距离矢量算法让路由器向每个邻居周期性的发送完整的路由表,包括每个网络或者子网的信息,相关的度量值等等 3 专业术语: 术语  描述 毒化路由 以前有效的路由,现在变成了无穷大的度量值。 毒性反转 以前因为水平分割不通告,但是现在以无穷大通告的路由 水平分割 接口特性,默认启动,限制每个接口发出的路由更新。对于一个指定的接口 任何出口为这个接口的路由都将不能记录在从这个接口触发的路由更新中 无穷大 路由器失效的路由的度量值。
用户1154259
2018/01/17
8560
干货 | 【算法】粒子群算法Particle Swarm Optimization超详细解析+代码实例讲解
这俗话说啊,早起的鸟儿有虫吃,早起的虫儿被鸟吃。而这个鸟抓虫子这个事儿啊,就像当初砸醒牛顿的苹果一样,居然也启发了两位博士,研究出了有用的大道理。那么,今天小编就带领大家,一起来看看这个让人好奇的大道理 -- 粒子群算法,究竟是个什么东西吧。
用户1621951
2019/10/18
2K0
干货 | 【算法】粒子群算法Particle Swarm Optimization超详细解析+代码实例讲解
最优化算法之粒子群算法(PSO)
粒子群优化算法(PSO:Particle swarm optimization) 是一种进化计算技术(evolutionary computation)。源于对鸟群捕食的行为研究。粒子群优化算法的基本思想:是通过群体中个体之间的协作和信息共享来寻找最优解. PSO的优势:在于简单容易实现并且没有许多参数的调节。目前已被广泛应用于函数优化、神经网络训练、模糊系统控制以及其他遗传算法的应用领域。
全栈程序员站长
2022/06/28
2.6K0
最优化算法之粒子群算法(PSO)
计算智能(CI)之粒子群优化算法(PSO)(一)
计算智能(ComputationalIntelligence ,CI)是以生物进化的观点认识和模拟智能。按照这一观点,智能是在生物的遗传、变异、生长以及外部环境的自然选择中产生的。在用进废退、优胜劣汰的过程中,适应度高的结构被保存下来,智能水平也随之提高。因此计算智能就是基于结构演化的智能。计算智能的主要方法有人工神经网络、遗传算法、遗传程序、演化程序、局部搜索、模拟退火等等。这些方法具有以下共同的要素:自适应的结构、随机产生的或指定的初始状态、适应度的评测函数、修改结构的操作、系统状态存储器、终止计算的条
磐创AI
2018/04/24
2.1K0
计算智能(CI)之粒子群优化算法(PSO)(一)
java矢量切片实现
可通过多种方式实现矢量切片的制作,前面讲到了基于postgis数据库、tippecanoe、Qgis等方式,本文讲述基于spring Boot框架下java的实现。
牛老师讲GIS
2023/05/27
7850
矢量数据空间查询
在前面四篇博客中我们主要讲了对于空间矢量数据的属性数据的增删改查,在这篇博文中我们要讲解空间查询–GIS系统很重要的一项功能。空间查询就是根据地物的空间位置进行查询的一种数据检索方式。比如,我们要查询一条河流经的城市;一个公园内的所有路灯;离当前位置最近的公共卫生间等等都属于常用的空间查询。
卡尔曼和玻尔兹曼谁曼
2020/06/16
1.6K0
JAVA NIO Scatter/Gather(矢量IO)
数据从几个缓冲区顺序抽取并沿着通道发送,就好比全部缓冲区全部连接起来放入一个大的缓冲区进行发送,缓冲区本身不具备gather能力。
WindWant
2020/09/11
6400
JAVA NIO Scatter/Gather(矢量IO)

相似问题

矢量推进速度?

65

从位置矢量求出速度矢量

34

随机矢量操纵

14

numpy矢量乘法速度?

11

基于角度和速度寻找速度矢量

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文