java 使用 isAlive() 启动一个线程
java start a thread using isAlive()
我是多线程新手;这是启动线程的正确方法吗?
if(!sesThread.isAlive()) {
try {
sesThread.start();
}catch(IllegalThreadStateException e) { System.out.println("y u start");}
}
前提:调用者处理字节数组并将其推送到队列中。会话线程是双端队列并进一步处理它们直到队列为空,因此会话的 运行() returns
问题:我收到了很多异常被抛出,即便如此我的会话线程由于某种原因它的 运行() 被调用了两次!
即(开始 > 开始 > 结束 > 结束)不是(开始 > 结束 > 开始 > 结束)
有什么方法可以同步或确保这种 "lazy instantiation" 机制调用只启动一次吗?
ps。我正在制作一个旨在提高传输速度的多线程 UDP 套接字服务器,因此在 isAlive()
之前有最小的延迟而不是一些 thread.sleep() 会很棒
未启动的线程只是另一个对象。调用 isAlive()
没有意义。 运行线程可以存活,线程对象不能。
Is there some way to synchronize or ensure this "lazy
instantiation"-ish mechanism call start only once?
线程只能启动一次。再次调用 start()
将导致 IllegalThreadStateException
不,你不应该使用这个机制。
您的消费者线程不应仅仅因为队列为空而终止。线程的启动成本很高。您应该使用 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();
}
}
我是多线程新手;这是启动线程的正确方法吗?
if(!sesThread.isAlive()) {
try {
sesThread.start();
}catch(IllegalThreadStateException e) { System.out.println("y u start");}
}
前提:调用者处理字节数组并将其推送到队列中。会话线程是双端队列并进一步处理它们直到队列为空,因此会话的 运行() returns
问题:我收到了很多异常被抛出,即便如此我的会话线程由于某种原因它的 运行() 被调用了两次!
即(开始 > 开始 > 结束 > 结束)不是(开始 > 结束 > 开始 > 结束)
有什么方法可以同步或确保这种 "lazy instantiation" 机制调用只启动一次吗?
ps。我正在制作一个旨在提高传输速度的多线程 UDP 套接字服务器,因此在 isAlive()
之前有最小的延迟而不是一些 thread.sleep() 会很棒未启动的线程只是另一个对象。调用 isAlive()
没有意义。 运行线程可以存活,线程对象不能。
Is there some way to synchronize or ensure this "lazy instantiation"-ish mechanism call start only once?
线程只能启动一次。再次调用 start()
将导致 IllegalThreadStateException
不,你不应该使用这个机制。
您的消费者线程不应仅仅因为队列为空而终止。线程的启动成本很高。您应该使用 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();
}
}