请教线程问题

gs5574 2023-8-18 1208

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


比如数组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 看帮助说什么要手动释放线程,是自动执行完自动释放吗?要是没全部执行完,怎么手动释放?

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

    Code AardioLine:29复制
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
    • 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 看帮助说什么要手动释放线程,是自动执行完自动释放吗?要是没全部执行完,怎么手动释放?

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

    Code AardioLine:31复制
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
    • 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
返回
发新帖