Java Thread не работает после метода Thread.sleep - PullRequest
0 голосов
/ 06 марта 2019

Я использовал приведенный ниже код для тестирования многопоточности, в методе выполнения ThreadDemo я добавил метод Thread.sleep (миллисекунды), но это не приведет к выводу. После удаления этого метода все работает нормально. Кто-нибудь может помочь объяснить это поведение?

import java.util.concurrent.*;

public class ThreadTest {
    private static ThreadLocal<Long> counter = new ThreadLocal<>();
public static void main(String[] args) {
    System.out.println("test start");
    counter.set(0l);
    int count = 3;
    ExecutorService executorService = Executors.newFixedThreadPool(count);

    for(int i=0;i<count;i++) {
        String name = "thread-"+i;
        executorService.submit(new ThreadDemo(name,counter));
    }

    System.out.println("test end");

}

public static class ThreadDemo implements Runnable{
    private String name;
    private ThreadLocal<Long> counter;
    public ThreadDemo(String name, ThreadLocal<Long> counter) {
        this.name = name;
        this.counter = counter;
    }

    public void run() {
        while(true) {

        Long val = (counter.get()  == null) ? 1 : ((counter.get()+1)%10);
        counter.set(val);
        System.out.println("name: "+this.name+" val "+val);

        Thread.sleep(10);
        }
    }

}
}

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

Не используйте ThreadLocal с ExecutorService! Опасно ли использовать ThreadLocal с ExecutorService?

Если вы хотите хранить данные, используйте другое решение вашей проблемы.

Другая проблема - вам нужен дескриптор InterruptedException, еслиВы используете Thread::wait(...), или Thread::sleep(...)

try {
  Thread.sleep(1000);
} catch (InterruptedException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
}

Другая проблема - это название вашей темы, проверьте эту статью: Именование потоков и пулов потоков в ExecutorService

Используйте имена потоков только для отладки, ваши потоки в ExecutorService должны быть без состояний.

0 голосов
/ 06 марта 2019

использование

Thread.currentThread().sleep(1000);// time is in milisecond
System.out.println("Test");// here you may know thread is waiting or not
...