为什么在这个代码完成消费者线程之后,生产者线程没有被中断,那是它的流量没有停止?
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();
}
}
答案 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变量并将其设置为类以成为一个线程,但它很容易。
我不明白为什么这些甚至需要以任何方式成为一个线程,它不应该与它一个接一个地运行吗?