0 امتیاز
قبل در برنامه نویسی توسط (127 امتیاز)
ویرایش شده قبل توسط

برای stop کردن یک Thread از چه تابعه ای می تونیم استفاده کنیم؟

قبل توسط (1.1هزار امتیاز)
منظورتون در زبان جاوا ؟

2 پاسخ

+1 امتیاز
قبل توسط (2.2هزار امتیاز)
انتخاب شده قبل توسط
 
بهترین پاسخ

برای این کار کافیه که متد kill رو اجرا کنید

 


public class Task implements Runnable {

   private volatile boolean isRunning = true;

   public void run() {

     while (isRunning) {
         //do work
     }
   }

   public void kill() {
       isRunning = false;
   }

}

 

0 امتیاز
قبل توسط (1.1هزار امتیاز)

کلاس Thread در جاوا متدی با نام stop دارد که deprecate شده است و نباید از آن استفاده کرد. دلیل deprecate شدن این متد خیلی مفصل است که می توانید در این لینک مطالعه کنید.

حال راه حل جایگزین چیست:

1- استفاده از یک فیلد flag از نوع volatile:

public final class Container implements Runnable {
  private final Vector<Integer> vector = new Vector<Integer>(1000);
  private volatile boolean done = false;
 
  public Vector<Integer> getVector() {
    return vector;
  }
 
  public void shutdown() {
    done = true;
  }
 
  @Override public synchronized void run() {
    Random number = new Random(123L);
    int i = vector.capacity();
    while (!done && i > 0) {
      vector.add(number.nextInt(100));
      i--;
    }
  }
 
  public static void main(String[] args) throws InterruptedException {
    Container container = new Container();
    Thread thread = new Thread(container);
    thread.start();
    Thread.sleep(5000);
    container.shutdown();
  }
}

2- استفاده از متد interrupt از کلاس Thread:

public final class Container implements Runnable {
  private final Vector<Integer> vector = new Vector<Integer>(1000);
 
  public Vector<Integer> getVector() {
    return vector;
  }
 
  @Override public synchronized void run() {
    Random number = new Random(123L);
    int i = vector.capacity();
    while (!Thread.interrupted() && i > 0) {
      vector.add(number.nextInt(100));
      i--;
    }
  }
 
  public static void main(String[] args) throws InterruptedException {
    Container c = new Container();
    Thread thread = new Thread(c);
    thread.start();
    Thread.sleep(5000);
    thread.interrupt();
  }
}
قبل توسط (7 امتیاز)
+1
البته به حای Thread.interrupted()  بهتره  از Thread.currentThread.isInterrupted() استفاده کرد.

سوالات مشابه

0 امتیاز
0 پاسخ 365 بازدید
+2 امتیاز
1 پاسخ 794 بازدید
سوال شده 7 سال قبل در برنامه نویسی توسط kapitan (25 امتیاز)
+1 امتیاز
1 پاسخ 1.0هزار بازدید
0 امتیاز
0 پاسخ 406 بازدید
0 امتیاز
1 پاسخ 2.8هزار بازدید
0 امتیاز
1 پاسخ 593 بازدید
0 امتیاز
1 پاسخ 2.3هزار بازدید
+1 امتیاز
1 پاسخ 837 بازدید
سوال شده 11 سال قبل در برنامه نویسی توسط kashi (7.2هزار امتیاز)
0 امتیاز
1 پاسخ 331 بازدید
...