线程没有在此代码中停止,任何原因?

时间:2014-03-13 18:24:19

标签: java multithreading

为什么在这个代码完成消费者线程之后,生产者线程没有被中断,那是它的流量没有停止?

class buffer{
    int value;
    public void consume()
    { 
        System.out.println(value+" is consumed");

    }
    public  void produce(int x)
    {

        value=x;
        System.out.println(value+" is produced");


    }


}
class producer extends Thread
{
    buffer x;

    public producer(buffer x)
    {
        this.x=x;
    }
    public void run()
    {
        for(int i=0;i<15;i++)
        {
            x.produce(i);

        }

    }
}
class consumer extends Thread
{
    buffer x;
    producer y;

    public consumer(buffer x,producer y) {
        super();
        this.x = x;
        this.y=y;
    }

    public void run()
    {
        for(int i=0;i<10;i++)
        {
            x.consume();
        }
        y.interrupt();
    }
}
class tester
{
    public static void main(String[] args) {

        buffer x=new buffer();
        producer z=new producer(x);
        consumer y=new consumer(x,z);
        y.start();
        z.start();
    }   
}

2 个答案:

答案 0 :(得分:3)

正如此处Java tutorial on Thread interruption所述

  

由程序员决定线程如何响应中断,但线程终止是很常见的。

你没有专门做任何处理中断的事情,所以当你调用

时没有任何反应
y.interrupt();

答案 1 :(得分:0)

我这样做的方法是实现Runnable

E.g:

public class producer implements Runnable{

buffer x;

public producer(buffer x){
    this.x=x;
}

@Override
public void run(){
    for(int i=0;i<15;i++){
        x.produce(i);
    }

}

当你想要停止线程时,你只需使用代码[THREAD TO STOP] .join();

E.G。 producerThread.join();

join方法等待线程安全停止但不是立即停止但是你可以使用 [线程停止] .stop()唯一的问题是它可能会导致其他问题,具体取决于您需要它。只有当你需要程序在那时停止时才使用它!

扩展线程不会起作用,因为你试图让这个类本身成为一个线程。 虽然您需要创建一个新的Thread变量并将其设置为类以成为一个线程,但它很容易。

我不明白为什么这些甚至需要以任何方式成为一个线程,它不应该与它一个接一个地运行吗?