我没有完全理解线程的概念我有一些问题。假设我们有以下代码:
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();
我想在线程启动时println()
“已启动”并在完成时“停止”。有可能吗?
当线程完成后,它会死掉,从内存中完全释放?如果没有,我怎么能这样做?
如何制作一个每1000毫秒重复一次的线程直到我按下一个键?我在考虑while(true) { t5.start; }
但我不确定。
答案 0 :(得分:5)
首先,使用start
和stop
方法毫无意义。一切都在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)
run()
方法的第一行打印“已开始”,然后在finally
方法的run()
部分或t5.join()
<之后打印“已停止” / LI>
java.util.Timer
答案 4 :(得分:0)
System.out.println
而不是printf
,只需更改这些代码行即可。这些电话与线程无关。stop()
。这是deprecated,应该由JVM处理,而不是应用程序代码。根据{{3}} run
即可实现您希望线程执行的任何操作
Thread.sleep
睡一段时间。睡眠的准确程度取决于您的平台和可用系统时钟的分辨率。