请教线程问题

gs5574 2023-8-18 879

看了官方帮助,不太明白,求教代码这么写


比如数组arr={

{1;2;3};

{11;4;56};

{7;8;89}

}

fun=function(n){return arr[n][1]+arr[n][2]}

fun2=function(n){return arr[n][1]>arr[n][2]}

ok=function(){提示执行完毕}

ok2=function(){提示索引}

1,根据数组arr长度创建等量线程,每个线程执行函数fun,等所有线程执行完毕后,执行ok,并关闭线程

2,根据数组arr长度创建等量线程,每个线程执行函数fun2,只要其中一个线程满足true,就返回索引,并执行ok2,处理索引,然后其它进程不用继续执行,并关闭线程。


当然这里只是举个例子,问问思路代码,不是只处理这么简单一个数组数据,谢谢




最新回复 (7)
  • 光庆 2023-8-18
    0 2
    第一个,启动线程,waitall 第二个,线程少的话,waitone ,线程多的话,可能出现线程还没完全启动呢,就已经有线程返回true了,所以,有必要每次启动前,都检查一下是否有线程返回true,可以用一个线程共享变量保存结果
  • tanzh 2023-8-18
    0 3
    此楼层已删除
  • gs5574 2023-8-18
    0 4
    看帮助说什么要手动释放线程,是自动执行完自动释放吗?要是没全部执行完,怎么手动释放?
  • 光庆 2023-8-18
    0 5
    gs5574 看帮助说什么要手动释放线程,是自动执行完自动释放吗?要是没全部执行完,怎么手动释放?

    下面是等待全部执行完毕的代码

    import thread;
    import thread.table;
    var threadTable = thread.table("线程共享表名称",true/*清空*/ )
    threadTable.indexFlag = 0;
    
    arr={
    {1;2;3};
    {11;4;56};
    {7;8;89};{1;2;3};
    {11;4;56};
    {7;8;89};{1;2;3};
    {11;4;56};
    {7;8;89};{1;2;3};
    {11;4;56};
    {7;8;89};
    }
    allthread = {}
    for(i=1;#arr;1){
        var th = thread.create(
            function(a,b){
                import console;
                console.log((a+b),"ok")
            },arr[i][1],arr[i][2]
        )
        table.push(allthread,th)
    }
    thread.waitAll(allthread)
    import console
    console.logPause("全部执行完毕")


  • 光庆 2023-8-18
    0 6
    gs5574 看帮助说什么要手动释放线程,是自动执行完自动释放吗?要是没全部执行完,怎么手动释放?

    下面是只需要一个执行完毕的

    import thread;
    import thread.table;
    var threadTable = thread.table("线程共享表名称",true/*清空*/ )
    threadTable.indexFlag = 0;
    
    arr={
    {1;2;3};
    {11;4;56};
    {7;8;89};{1;2;3};
    {11;4;56};
    {7;8;89};{1;2;3};
    {11;4;56};
    {7;8;89};{1;2;3};
    {11;4;56};
    {7;8;89};
    }
    
    var t = thread.var("wait",false)
    for(i=1;#arr;1){
        var th = thread.create(
            function(a,b){
                var t = thread.var("wait",false)
                t.set(true);
                import console;
                console.log((a+b),"ok")
            },arr[i][1],arr[i][2]
        )
        if t.get() break;
    }
    import console
    console.logPause("有一个已经执行完毕")


  • gs5574 2023-8-18
    0 7
    谢谢版主回复,6楼数组数据量小时已判断完就可跳出循环,不继续创建线程,如果数据量大还是每个线程都要执行完,能否其中一个线程满足要求,其它正在运行的线程就不继续执行。还有帮助说什么需要手动释放线程,什么时候需要手动?
  • gs5574 2023-8-18
    0 8
    谢谢帮助,我在这里问到答案了 https://www.aardio.cc/forum.php?mod=viewthread&tid=110&fromguid=hot&extra=&mobile=2
返回
发新帖