线程完成后检查执行代码

时间:2012-01-15 20:02:37

标签: java multithreading

我没有完全理解线程的概念我有一些问题。假设我们有以下代码:

ExecCommand.java

// I don't know how this work, for now
package therads;

// Here we will have the methods and run them from the Main.java
public class ExecCommand implements Runnable
{
    String name;
    int time;

    public ExecCommand(String s,int amount)
    {
        name = s;
        time = amount;
    }

    // Run method (Runnable)
    public void run()
    {
        try
        {
            // What to execute when the thread is started
            System.out.printf("%s is sleeping for %d\n",name,time);
            Thread.sleep(time);
            System.out.printf("%s is done\n",name);
        }
        catch(Exception e)
        {

        }
    }

    // This dosen't work when the thread is stopped
    public void stop()
    {
        try
        {
            System.out.printf("STOPPED!");
        }
        catch(Exception e)
        {

        }
    }

    // This dosen't work when the thread is started
    public void start()
    {
        try
        {
            System.out.printf("Started!");
        }
        catch(Exception e)
        {

        }

    }
}

我打电话给他:

Main.java

Thread t5 = new Thread(new ExecCommand("Good Function",1000));
t5.start();
  1. 我想在线程启动时println()“已启动”并在完成时“停止”。有可能吗?

  2. 当线程完成后,它会死掉,从内存中完全释放?如果没有,我怎么能这样做?

  3. 如何制作一个每1000毫秒重复一次的线程直到我按下一个键?我在考虑while(true) { t5.start; }

  4. 但我不确定。

5 个答案:

答案 0 :(得分:5)

首先,使用startstop方法毫无意义。一切都在run方法中发生。

要在开始和结束时打印消息,请将它们放在run方法的开头和结尾。要无限循环并继续执行代码直到外部事件发生,请在其上使用标志和循环:

class ThreadTask implements Runnable {
    private volatile boolean flag = false;

    public void setFlag(boolean value) {
        flag = value;
    }

    public void run() {
        System.out.println("Started");
        while(!flag) {
           // execute code
        }
        System.out.println("Stopped");
    }
}

然后,当您希望线程停止时,只需使用setFlag将标志设置为true。

是的,运行方法终止后,运行时+操作系统会自动清除线程。

答案 1 :(得分:3)

为什么或何时会调用.start()和.stop()? Runnable在接口中只有一个方法; 。跑()。 JavaDocs for Thread非常适合它。 http://docs.oracle.com/javase/6/docs/api/java/lang/Thread.html。如果你想在线程启动时发生某些事情,那就把它放在.run()的顶部。如果你想在线程完成时发生某些事情,请将它放在.run()的底部。不建议在Thread上使用.start()和.stop()方法执行任何操作。专注于在.run()中完成所有生命周期内容。并获得Goetz的“Java Concurrency in Practice”的副本。它会向您显示所有选项(包括不直接拥有Threading)。

答案 2 :(得分:0)

您不应该覆盖启动和停止方法。它们不是回调方法。

你想要的是类似于SwingWorker类的东西(假设你对与UI相关的线程同步感兴趣)。

如果没有,您可以自己继承Thread并提供回调机制。

答案 3 :(得分:0)

  1. 当然可以。您只需在run()方法的第一行打印“已开始”,然后在finally方法的run()部分或t5.join() <之后打印“已停止” / LI>
  2. 你没有被告知细节,也无能为力。但是您可以假设资源在必要时被释放。 (当然,如果您的线程中分配的任何引用都有可访问的链接,JVM无法确定这些是没用的,所以“完整”在这里不是一个合适的词。)
  3. 查看java.util.Timer

答案 4 :(得分:0)

  1. 如果您希望使用System.out.println而不是printf,只需更改这些代码行即可。这些电话与线程无关。
  2. 当垃圾收集器停止运行并且没有对它的实时引用时,它将被垃圾收集器从内存中收集和释放。与所有对象相同。
  3. 不要覆盖stop()。这是deprecated,应该由JVM处理,而不是应用程序代码。根据{{​​3}}
  4. ,只需覆盖run即可实现您希望线程执行的任何操作
  5. 您可以使用Thread.sleep睡一段时间。睡眠的准确程度取决于您的平台和可用系统时钟的分辨率。