java使用isAlive()启动一个线程

时间:2015-03-17 09:16:51

标签: java multithreading thread-safety

我是多线程的新手;这是开始一个线程的正确方法吗?

if(!sesThread.isAlive()) {
    try {
        sesThread.start();
    }catch(IllegalThreadStateException e) { System.out.println("y u start");}
}

前提:调用者处理bytearrays并将其推送到队列。会话线程是deque并进一步处理它们直到队列为空,因此会话的run()返回

问题:我得到了很多异常被抛出,所以我的会话线程出于某种原因让它的run()被调用了两次!

即。 (开始>开始>结束>结束)NOT(开始>结束>开始>结束)

有没有办法同步或确保这个“懒惰的实例化”-ish机制调用只启动一次?

PS。我正在制作一个针对传送速度的多线程UDP套接字服务器,所以最好有最小的延迟而不是isAlive()之前的一些thread.sleep()

2 个答案:

答案 0 :(得分:1)

不,你不应该使用这种机制。

您的消费者线程不应仅因为队列为空而终止。线程开始很昂贵。您应该使用BlockingQueue并在队列为空时让您的消费者线程阻塞。

public class TwoThreads {

    public static void main(String args[]) throws InterruptedException {
        System.out.println("TwoThreads:Test");
        new TwoThreads().test();
    }

    // The end of the list.
    private static final Integer End = -1;

    static class Producer implements Runnable {

        final BlockingQueue<Integer> queue;

        public Producer(BlockingQueue<Integer> queue) {
            this.queue = queue;
        }

        @Override
        public void run() {
            try {
                for (int i = 0; i < 1000; i++) {
                    queue.add(i);
                    Thread.sleep(1);
                }
                // Finish the queue.
                queue.add(End);
            } catch (InterruptedException ex) {
                // Just exit.
            }
        }

    }

    static class Consumer implements Runnable {

        final BlockingQueue<Integer> queue;

        public Consumer(BlockingQueue<Integer> queue) {
            this.queue = queue;
        }

        @Override
        public void run() {
            boolean ended = false;
            while (!ended) {
                Integer i = queue.take();
                ended = i == End;
                System.out.println(i);
            }
        }

    }

    public void test() throws InterruptedException {
        BlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
        Thread pt = new Thread(new Producer(queue));
        Thread ct = new Thread(new Consumer(queue));
        // Start it all going.
        pt.start();
        ct.start();
        // Wait for it to finish.
        pt.join();
        ct.join();
    }

}

答案 1 :(得分:0)

未启动的线程只是另一个对象。拨打isAlive()毫无意义。 运行线程可以是活动的,线程对象不能。

  

是否有某种方法可以同步或确保这种“懒惰”   实例化“-ish机制调用只启动一次?

线程只能启动一次。再次致电start()会导致IllegalThreadStateException