2016-12-30 85 views
0

我尝试使用volatile布尔值来充当停止/启动/重新启动线程中的动作的标志,但它不起作用。它只是一直持续下去,永不终止。任何帮助如何正确地做到这一点或为什么我的代码不起作用将不胜感激。提前致谢。如何使用标志重新启动线程中的操作?

public class thread { 

    public static int i = 0; 
    private static Thread print = null; 
    private static printThread runnable = null; 

    public static void main(String[] args) { 
     runnable = new printThread(); 
     print = new Thread (runnable); 
     print.start(); 

     System.out.println("Starting"); 
     runnable.begin(); 
     if(i > 5) 
     { 
      runnable.terminate(); 
     } 

     i = 10; 
     runnable.begin(); 
     if(i > 15) 
     { 
      runnable.terminate(); 
     } 
    } 

    public static final void print() 
    { 
     System.out.println(i); 
     i++; 
    } 

    public static final class printThread implements Runnable { 
     private volatile boolean running = false; 

     public void terminate() { 
      running = false; 
     } 

     public void begin() { 
      running = true; 
     } 

     public boolean isRunning() { 
      return running; 
     } 

     public void run() { 
      while(true) 
      { 
       if(running) 
       { 
        print(); 
       } 

       else 
       { 

       } 
      } 
     } 
    } 
} 
+0

“这行不通”比较模糊。请修改您的问题以扩展程序的预期行为。你应该真的了解[并发](https://docs.oracle.com/javase/tutorial/essential/concurrency/)。 – Paul

+0

可能是因为terminate()永远不会被调用。例如,主函数在'i'变为5之前执行了它的主体。 – Tsyvarev

回答

1

在您的代码while循环执行永远不会结束。您可以引入2个状态:终止并等待模拟线程启动/暂停/重新启动/停止。但是,即使您暂停了线程,它也会运行,只是不同的代码分支将在while循环内执行。

请参见下面

public static final class printThread implements Runnable { 
    private volatile boolean waiting = false; 
    private volatile boolean terminated = false; 


    public void terminate() { 
     terminated = true; 
    } 

    public void pause() { 
     waiting = true; 
    } 

    public void restart() { 
     waiting = false; 
    } 

    public void run() { 
     while(!terminated) { 
      if(waiting) { 
       //the thread is paused 
      } else { 
       //the thread is running 
      } 
     } 
    } 
} 
1

的代码片段但它不工作。它只是一直持续下去,永不终止。

在你的线程run()方法,你是不是看你volatile boolean running字段的值。它可能应该是这样的:

public void run() { 
     while(!running) { 
      print(); 
      // you might want a short Thread.sleep(10); here to stop the spinning 
     } 
    } 

但@Anton指出,一旦你的线程终止,它不能重新启动没有其他标志。看到他的答案。

此外,您在主线程和您的打印线程之间共享i。这也需要是volatile,以便它可以正确共享。由于您在多个线程中递增,因此您应该使用AtomicInteger

public static AtomicInteger i = new AtomicInteger(); 
... 
if (i.get() > 5) ... 
... 
i.set(10); 
... 
i.incrementAndGet(); 

夫妇的其他意见:

  • 小心static领域。 printrunnable应仅限于main(...)方法内限制访问。
  • 类应该以大写字母开头,所以它应该是PrintThread
  • 其实,因为PrintThread不是线程,应该是PrintRunnable或者甚至更好,Printer
相关问题