一个产品经理在学习代码,有些问题可能比较初级,各位请多多包涵。我在学习线程有关的内容,首先尝试建立一个线程来循环输出一句话,然后再主线程中设立一个条件尝试利用一个boolean来终结当前正在运行的线程。可是在运行了以后发现主线程一直在输出,知道最后才输出了线程结束。感觉上去就想线程还没有开始就被终结了,但是终结了以后又被启动了一下。按理来说应该“主线程” 和 “Thread” 应该交叉显示才对。请问各位我在这边发生了什么错误呢?
主线程 94
主线程 95
主线程 96
主线程 97
主线程 98
主线程 99
Thread Stopped.
Thread 0
public TerminateThread(String name) {
this.name = name;
}

@Override
public void run() {
int i = 0;
// 当Live的值是True的时候,继续线程,false则结束循环。
while (live) {
System.out.println(name + " " + (i++));
}
} public void terminate(){
live = false;
} public static void main(String[] args) {
TerminateThread thread = new TerminateThread("Thread");
new Thread(thread).start(); for (int i = 0; i < 100; i++) {
if (i == 88) {
thread.terminate(); 
System.out.println("Thread stop");
}
System.out.println("这是主线程");
}
}

解决方案 »

  1.   

    说白了就是一个线程集合workerSet和一个阻塞队列workQueue。当用户向线程池提交一个任务(也就是线程)时,线程池会先将任务放入workQueue中。workerSet中的线程会不断的从workQueue中获取线程然后执行。当workQueue中没有任务的时候,worker就会阻塞,直到队列中有任务了就取出来继续执行。
      

  2.   

    这主要是看cpu怎么去调配线程,主线程本身在执行,已经分的cpu了,你可以在每个线程的打印后加上  Thread.sleep(毫秒数),这样就能看到效果了
      

  3.   


    试试添加volatile
    private volatile boolean live=true;
      

  4.   

    需要使用volatile关键字修饰live变量,因为你使用这个变量需要在多线程环境中被实时发现,就是所谓的线程可见性。
    java更建议使用中断来处理这样的问题,
    while(!Thread.currentThread().isInterrupted()){
    System.out.println(name + " " + (i++));
    }
    在客户端获取线程引用t,调用t.interupt发出中断。