Java 用户定义线程和系统线程之间的差异(对于睡眠方法)

Java 用户定义线程和系统线程之间的差异(对于睡眠方法),java,multithreading,thread-safety,threadpool,Java,Multithreading,Thread Safety,Threadpool,这是我正在工作的样本 Thread[] TCreate = new Thread[sexDataSize]; for(int i=0;i<sexData.size();i++) { final SDISQueryBuilder _qryBulider=qryBulider; final String _newQry=_qryBulider.getQueryStringOnSex(sexData.get(i).getName(), baseQr

这是我正在工作的样本

Thread[] TCreate = new Thread[sexDataSize];
    for(int i=0;i<sexData.size();i++)
    {
        final SDISQueryBuilder _qryBulider=qryBulider;
        final String _newQry=_qryBulider.getQueryStringOnSex(sexData.get(i).getName(), baseQry, SDISCommonParam.onSEXID,sdisQueryInfo);
        final int _i = i;
        TCreate[i] = new Thread(new Runnable() {
            public void run()
            {
                groupData.add("GROUPID_"+(_i+1), ((List<Count>) _qryBulider.facetOn_FieldName(_newQry.replace("1028","1046" ), SDISQueryInfo.url3, SDISCommonParam.onGroupID).getValues()));        
            }});
        TCreate[i].setName("GROUPID_"+(_i+1));
        TCreate[i].start();     
    }
    for(int i=0;i<sexData.size();i++)
            while (TCreate[i].isAlive()) Thread.sleep(10);
Thread[]TCreate=新线程[sexDataSize];

例如(int i=0;i
'Thread.sleep()'
是一个静态方法,这意味着它的执行不依赖于它调用的实例。换句话说,
'myThread.sleep()'
'otherThread.sleep()的意思相同“
如果这两个对象都是
'Thread'
类的实例

,则无论您给

Thread.sleep(millis);
方法同上

Thread.currentThread().sleep();
您不能以这种方式使另一个线程睡眠。相反,您需要有一个共享资源,线程检查或等待,您的控制线程使该资源不可用。

thread.sleep(10)将休眠当前正在执行的线程,即不一定是数组中的一个线程,更有可能是生成其他线程的主线程(查看您的示例),因为它来自您调用它的线程

如果您想要实现的是让您的生成过程等待它的所有子进程完成工作,那么Java为此提供了一种内置机制,即join方法。它所做的是让您进行调用的线程等待您调用它的线程完成。如果这确实是您想要实现的,那么n将上一个for循环替换为以下内容:

for(Thread t : TCreate){ //Consider naming variables with initial lowercase
   t.join();
//Should be called after it's been started but not until you have started all of them
}
//Execution resumes here when all spawned threads have completed their task.

我希望这能让它更清楚。

…因此,为了避免混淆,永远不要对对象实例调用静态方法。我无法理解您的意思。您能更具体地说明join()。请举例说明