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

时间:2011-07-05 10:03:25

标签: 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(), 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.sleep(10) TCreate [i] .sleep(10)之间的区别。两者都一样吗?还有其他问题吗?以及我是否正确处理线程。如果有变化,请告诉我。提前致谢

3 个答案:

答案 0 :(得分:3)

'Thread.sleep()'是一个静态方法,这意味着它的执行不依赖于它调用的实例。换句话说,如果两个对象都是'myThread.sleep()'

的实例,则'otherThread.sleep()'表示与'Thread'相同

答案 1 :(得分:3)

无论你给出什么对象

Thread.sleep(millis);

方法与

相同
Thread.currentThread().sleep();

你不能以这种方式让另一个线程睡觉。相反,您需要拥有线程检查或等待的共享资源,并且您的控制线程使该资源不可用。

答案 2 :(得分:2)

Thread.sleep(10)将睡眠当前正在执行的线程,即不一定是你的数组中的一个线程,更可能是产生其他人查看你的例子的主线程,因为它来自你调用的那个线程它

如果你想要实现的是让你的产生过程等到所有它的孩子都完成了工作,那么Java为它提供了一个内置的机制,即join方法。它的作用是使你进行调用的线程等到你调用它的线程结束。如果这确实是您想要实现的目标,那么请使用以下内容替换上一个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.

我希望这更清楚。