小编Sha*_*n00的帖子

如何确定对象是否被锁定(同步)以便不在Java中阻塞?

我有一个进程A,它在内存中包含一组带有一组记录的表(recordA,recordB等......)

现在,这个进程可以启动许多影响记录的线程,有时我们可以有2个线程试图访问同一条记录 - 这种情况必须被拒绝.特别是如果一个记录被一个线程锁定,我希望另一个线程中止(我不想BLOCK或WAIT).

目前我这样做:

synchronized(record)
{
performOperation(record);
}
Run Code Online (Sandbox Code Playgroud)

但是这导致了我的问题......因为当Process1正在执行操作时,如果Process2进入,则阻塞/等待同步语句,并且当Process1完成时,它执行操作.相反,我想要这样的东西:

if (record is locked)
   return;

synchronized(record)
{
performOperation(record);
}
Run Code Online (Sandbox Code Playgroud)

有关如何实现这一目标的任何线索?任何帮助将非常感激.谢谢,

java synchronization

71
推荐指数
4
解决办法
5万
查看次数

确定数组中最常见的事件

假设我有一系列双打,如下所示:

Array[10] = {10, 10, 10, 3, 10, 10, 6, 10, 10, 9, 10}
Run Code Online (Sandbox Code Playgroud)

我需要一个函数来确定数组中MAJORTY投票的内容,在本例中为"10",因为它是最常出现的数字......当然还有没有多数投票的情况(它们在哪里)等于),在这种情况下,我需要抛出异常......

有线索吗?除了在数组上做一些非常讨厌的循环之外(对于每个索引,确定存在多少具有相同值的数量,在数组中存储计数,然后扫描计数数组中的最高数字,并且该位置的值是赢家等...)

java algorithm

10
推荐指数
2
解决办法
2万
查看次数

如何解锁ConnectNamedPipe和ReadFile?[C#]

我有一个类(NamedPipeManager),它有一个线程(PipeThread)等待使用(ConnectNamedPipe)的NamedPipe连接,然后读取(ReadFile) - 这些是阻塞调用(不重叠) - 但是有一点我想要解锁它们 - 例如当调用类试图停止NamedPipeManager时...

我怎么能打断它呢?使用Thread.abort?了Thread.interrupt?有没有正确的方法来处理这个?请参阅下面的代码,该代码说明了我目前的情况

main()
{
    NamedPipeManager np = new NamedPipeManager();
        ... do stuff ...
    ... do stuff ...
    np.Stop();      // at this point I want to stop waiting on a connection
}


class NamedPipeManager
{
private Thread PipeThread;

public NamedPipeManager
{
    PipeThread = new Thread(new ThreadStart(ManagePipes));
    PipeThread.IsBackground = true;
    PipeThread.Name = "NamedPipe Manager";
    PipeThread.Start();
}

private void ManagePipes()
{
    handle = CreateNamedPipe(..., PIPE_WAIT, ...);
    ConnectNamedPipe(handle, null);     // this is the BLOCKING call waiting for client …
Run Code Online (Sandbox Code Playgroud)

c# c++ pinvoke pipe named-pipes

7
推荐指数
2
解决办法
6146
查看次数

如何根据另一个表的查找插入值?

我需要找到一种方法来做一个INSERT INTO table A但是其中一个值是来自表B上的查找,允许我说明.

我有以下两个表:

表A:

A1: String
A2: Integer value coming from table B
A3: More Data
Run Code Online (Sandbox Code Playgroud)

表B:

B1: String
B2: Integer Value
Run Code Online (Sandbox Code Playgroud)

A的示例行:{"Value",101,MoreData} B的示例行:{"English",101}

现在,我知道我需要将以下内容插入到A {"Value2","English",MoreData}中,但显然这是行不通的,因为它期望第二列中的Integer不是"English",所以我需要首先在表B中进行查找.

像这样的东西:

INSERT INTO tableA (A1, A2, A3) 
VALUES ("Value2", SELECT B2 FROM tableB where B1="English", MoreData);
Run Code Online (Sandbox Code Playgroud)

显然这不起作用......

有什么建议?

sql insert-into

7
推荐指数
1
解决办法
5735
查看次数

子线程如何通知父线程其状态/进度?

我有一个服务负责许多任务,其中一个是在一个单独的线程(threadJob子)上启动作业(一次一个),这些作业可能需要相当长的时间和

有各种各样的阶段,我需要报告.

通常,调用应用程序从服务请求状态(GetStatus),这意味着服务需要知道什么时候作业(子线程)是

在,我希望在某些里程碑,子线程可以某种方式通知(SetStatus)其状态的父线程(服务),并且服务可以返回该信息

到调用应用程序.

例如 - 我希望做这样的事情:

class Service
{
private Thread threadJob;
private int JOB_STATUS;

public Service()
    {
    JOB_STATUS = "IDLE";
    }

public void RunTask()
    {
    threadJob = new Thread(new ThreadStart(PerformWork));
    threadJob.IsBackground = true;
    threadJob.Start();
    }

public void PerformWork()
    {
    SetStatus("STARTING");
    // do some work //
    SetStatus("PHASE I");
    // do some work //
    SetStatus("PHASE II");
    // do some work //
    SetStatus("PHASE III");
    // do some work //
    SetStatus("FINISHED");
    }

private void SetStatus(int status)
    {
    JOB_STATUS = status;
    } …
Run Code Online (Sandbox Code Playgroud)

c#

6
推荐指数
2
解决办法
8034
查看次数

从启动的线程收集返回值?[最新的Java]

我正在寻找实现以下内容的最简单,最直接的方法:

  • 主要启动并启动3个线程
  • 所有3个任务都处理并以结果值结束(我需要以某种方式返回?)
  • 主要等待(.join?)在每个线程上,以确保他们已经完成了所有3个任务
  • main以某种方式获取每个线程的值(3个值)

然后其余部分相当简单,处理3个结果然后终止......

现在,我一直在做一些阅读,发现了多个想法,比如:

  • 使用Future,但这是forynch,当主线程需要阻止等待所有3个生成的线程到finsih时,这真的是一个好主意吗?
  • 传入一个对象(到一个线程),然后简单地让线程"填充"结果
  • 不知何故使用Runnable(不确定如何).

无论如何 - 什么是最好的,最简单的推荐方法?谢谢,

java multithreading

3
推荐指数
1
解决办法
1160
查看次数