Разница между пользовательской нитью и системной нитью (для режима сна) - PullRequest
0 голосов
/ 05 июля 2011

Вот пример, с которым я работал

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 ]

3 голосов
/ 05 июля 2011

Независимо от того, какой объект вы даете

Thread.sleep(millis);

метод такой же, как

Thread.currentThread().sleep();

Вы не можете заставить другой поток спать таким образом. Вместо этого вам нужно иметь общий ресурс, который потоки проверяют или ожидают, а ваш управляющий поток делает этот ресурс недоступным.

3 голосов
/ 05 июля 2011

'Thread.sleep()' - статический метод, который означает, что его выполнение не зависит от экземпляра, который он вызвал. Другими словами 'myThread.sleep()' означает то же самое, что и 'otherThread.sleep()', если оба эти объекта являются экземплярами 'Thread' class

2 голосов
/ 05 июля 2011

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.

Надеюсь, это прояснилось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...