我对java线程有一些疑问:
2.如何让一个线程通知从同一个类运行的所有其他线程停止?
3.使用synchronized只使用一个线程,无论代码中的源代码是什么,都要做这部分代码?
4.如果我使用run()在java中运行一个线程,如果我从run()内部调用一个方法,这仍然作为一个线程运行还是不允许?
答案 0 :(得分:2)
1)只有当线程是守护进程时,即使它们正在运行,应用程序也不会等待关闭。
示例:评论与否setDaemon(true)
public class Test {
public static void main(final String[] args) {
new Launcher(parent).start();
}
public static class Launcher extends Thread {
public Launcher(final String name) {
this.setName(name);
}
@Override
public void run() {
System.err.println(getName() + is starting);
for (int i = 0; i < 10; i++) {
new Waiter(child + i).start();
}
try {
Thread.sleep(1000);
System.err.println(getName() + is no more sleeping);
} catch (final InterruptedException e) {
e.printStackTrace();
}
System.err.println(getName() + is stopping);
}
}
public static class Waiter extends Thread {
public Waiter(final String name) {
super(name);
super.setDaemon(true);
}
@Override
public void run() {
System.err.println(getName() + is starting);
try {
Thread.sleep(12000);
System.err.println(getName() + is no more sleeping);
} catch (final InterruptedException e) {
e.printStackTrace();
}
}
}
}
2)强制停止,可以使用不同的方法,不同的模式。很抱歉没有解决方案。您可以查看:http://docs.oracle.com/javase/7/docs/api/java/lang/ThreadGroup.html
3)是的,这是同步的目标。
4)这取决于你做什么,但基本上,调用方法不会启动另一个线程,除非方法这样做。
答案 1 :(得分:1)
如果我有一个运行多个线程的类,当一个线程到达exit(1)命令行时它会退出线程还是整个应用程序,包括其他线程?
对System.exit(1)
的调用将终止调用线程和所有其他线程。这是结束Java程序最残酷的方式,即完全关闭JVM,并且很少根本不可用。
如何让一个线程通知从同一个类运行的所有其他线程停止?
完全没有。如果您有其他Thread
个对象的引用,则可以调用Thread#interrupt()
,但是其他线程是否检查其中断状态或到达可能会抛出InterruptedException
的位置他们。
使用synchronized只使用一个线程,无论代码中的源代码如何,都可以执行这部分代码吗?
直观地说是。但是,当此块中存在wait()
时,相应的锁(即synchronized
上的对象)将被释放并可由其他线程获取。
如果我使用run()在java中运行一个线程,如果我从run()内部调用一个方法,它仍然作为一个线程运行,或者它是不允许的?
当一个线程调用一个方法时,那个同样的线程也执行这个方法(默默地想知道它应该怎么做......)