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()。请举例说明