java 怎么创建一个新的进程

我想用java写了一个JFrame窗体,在点击关闭按钮的时候调用一个批处理文件,然后主程序退出,批处理文件把主程序删除,然后删除自己。
现在我用的是Runtime.getRuntime().exec("*.bat");这个方法。但是现在运行主程序,点关闭,程序就卡死那里了。因为Runtime.getRuntime().exec()创建出来的也是子进程还是依赖于JFrame窗体。能不能用java创建出一个和本程序没有关系的新进程,或者是有什么其他的方法可以删除自身。(用java语言)
kenshin54 你的方法好像不行啊,还是只能删除别的文件,删除自己的话没反应,文件还是在那。

rnxefe 我觉得你的方法也行,能说的具体点吗?

kenshin54 你先在桌面上创建出来两个文件再删除是可以的,但是它自己本身的A.class能不能删除呢?这才是我想要的。。。或者是打成jar包之后,运行完,自己把自己删除,就像一些病毒,或者卸载程序。
kenshin54 非常感谢你的回答,你的方法我试过了,确实可以。但是我打成jar包之后为什么就不行了?
import java.io.File;

public class A
{
public static void main(String[] args)
{
File file = new File("A.class");
File file1 = new File("A.jar");
File file2 = new File("A.java");
file.deleteOnExit();
file1.deleteOnExit();
file2.deleteOnExit();
}
}
//A.java和A.class都能删除,唯独它自己A.jar删除不了。。。

yangguo2005 你的路径是怎么写的?路径没有错啊……
import java.io.File;

public class A
{
public static void main(String[] args)
{
File file = new File("D:\\1\\A.jar");
file.deleteOnExit();
}
}
//这样写也不行…

不能创建进程,只能创建线程
在Java中,类仅支持单继承,也就是说,当定义一个新的类的时候,它只能扩展一个外部类.这样,如果创建自定义线程类的时候是通过扩展 Thread类的方法来实现的,那么这个自定义类就不能再去扩展其他的类,也就无法实现更加复杂的功能。因此,如果自定义类必须扩展其他的类,那么就可以使用实现Runnable接口的方法来定义该类为线程类,这样就可以避免Java单继承所带来的局限性。
还有一点最重要的就是使用实现Runnable接口的方式创建的线程可以处理同一资源,从而实现资源的共享.
(1)通过扩展Thread类来创建多线程
假设一个影院有三个售票口,分别用于向儿童、成人和老人售票。影院为每个窗口放有100张电影票,分别是儿童票、成人票和老人票。三个窗口需要同时卖票,而现在只有一个售票员,这个售票员就相当于一个CPU,三个窗口就相当于三个线程。通过程序来看一看是如何创建这三个线程的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

<span style="font-size: 16px;">public class MutliThreadDemo {
public static void main(String [] args){
MutliThread m1=new MutliThread("Window 1");
MutliThread m2=new MutliThread("Window 2");
MutliThread m3=new MutliThread("Window 3");
m1.start();
m2.start();
m3.start();
}
}
class MutliThread extends Thread{
private int ticket=100;//每个线程都拥有100张票
MutliThread(String name){
super(name);//调用父类带参数的构造方法
}
public void run(){
while(ticket>0){
System.out.println(ticket--+" is saled by "+Thread.currentThread().getName());
}
}
}
</span>

程序中定义一个线程类,它扩展了Thread类。利用扩展的线程类在MutliThreadDemo类的主方法中创建了三个线程对象,并通过start()方法分别将它们启动。
从结果可以看到,每个线程分别对应100张电影票,之间并无任何关系,这就说明每个线程之间是平等的,没有优先级关系,因此都有机会得到CPU的处理。但是结果显示这三个线程并不是依次交替执行,而是在三个线程同时被执行的情况下,有的线程被分配时间片的机会多,票被提前卖完,而有的线程被分配时间片的机会比较少,票迟一些卖完。
可见,利用扩展Thread类创建的多个线程,虽然执行的是相同的代码,但彼此相互独立,且各自拥有自己的资源,互不干扰。
(2)通过实现Runnable接口来创建多线程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

<span style="font-size: 16px;">public class MutliThreadDemo2 {
public static void main(String [] args){
MutliThread m1=new MutliThread("Window 1");
MutliThread m2=new MutliThread("Window 2");
MutliThread m3=new MutliThread("Window 3");
Thread t1=new Thread(m1);
Thread t2=new Thread(m2);
Thread t3=new Thread(m3);
t1.start();
t2.start();
t3.start();
}
}
class MutliThread implements Runnable{
private int ticket=100;//每个线程都拥有100张票
private String name;
MutliThread(String name){
this.name=name;
}
public void run(){
while(ticket>0){
System.out.println(ticket--+" is saled by "+name);
}
}
}
</span>

由于这三个线程也是彼此独立,各自拥有自己的资源,即100张电影票,因此程序输出的结果和(1)结果大同小异。均是各自线程对自己的100张票进行单独的处理,互不影响。
可见,只要现实的情况要求保证新建线程彼此相互独立,各自拥有资源,且互不干扰,采用哪个方式来创建多线程都是可以的。因为这两种方式创建的多线程程序能够实现相同的功能。

由于这三个线程也是彼此独立,各自拥有自己的资源,即100张电影票,因此程序输出的结果和例4.2.1的结果大同小异。均是各自线程对自己的100张票进行单独的处理,互不影响。
可见,只要现实的情况要求保证新建线程彼此相互独立,各自拥有资源,且互不干扰,采用哪个方式来创建多线程都是可以的。因为这两种方式创建的多线程程序能够实现相同的功能。
(3)通过实现Runnable接口来实现线程间的资源共享
现实中也存在这样的情况,比如模拟一个火车站的售票系统,假如当日从A地发往B地的火车票只有100张,且允许所有窗口卖这100张票,那么每一个窗口也相当于一个线程,但是这时和前面的例子不同之处就在于所有线程处理的资源是同一个资源,即100张车票。如果还用前面的方式来创建线程显然是无法实现的,这种情况该怎样处理呢?看下面这个程序,程序代码如下所示:

+ View Code
结果正如前面分析的那样,程序在内存中仅创建了一个资源,而新建的三个线程都是基于访问这同一资源的,并且由于每个线程上所运行的是相同的代码,因此它们执行的功能也是相同的。
可见,如果现实问题中要求必须创建多个线程来执行同一任务,而且这多个线程之间还将共享同一个资源,那么就可以使用实现Runnable接口的方式来创建多线程程序。而这一功能通过扩展Thread类是无法实现的,读者想想看,为什么?
实现Runnable接口相对于扩展Thread类来说,具有无可比拟的优势。这种方式不仅有利于程序的健壮性,使代码能够被多个线程共享,而且代码和数据资源相对独立,从而特别适合多个具有相同代码的线程去处理同一资源的情况。这样一来,线程、代码和数据资源三者有效分离,很好地体现了面向对象程序设计的思想。因此,几乎所有的多线程程序都是通过实现Runnable接口的方式来完成的。追问

谢谢!

温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-08-13
不成熟的看法:如果果真是你说的影响的话,你可以先调用一个批处理,然后批处理在调用一个批处理删除. 这样肯定不会受虚拟机影响了。不过我知道肯定没影响的,你想原理:批处理是操作系统调用,java是虚拟机调用,虚拟机还是操作系统调用。
建议你先运行那个删除批处理。然后做一个超级简单的批处理,让java运行它。两个都通过之后java再运行删除批处理。这样分开运行更容易排错。
第2个回答  2009-08-13
估计得用到注册表 在重启时才行

以前写过一个程序就是把自己设置成开机启动模式
具体方式是在注册表项的开机启动中塞入一个批处理路径,这样在操作系统启动后就自动启动了这个批处理,然后再在这个批处理文件里做手脚,我的是让我的 java 程序启动(这样就实现了开机启动我的java程序了),你嘛,就删除一批文件就行了,不难,很容易实现,只是在 dos 下删除文件而已。

另外我觉得不太可能一个程序在自己运行中把自己给删除了吧?只有等到程序结束了才能把它自己给删除了

另外你也可以让 java 程序去执行一个批处理文件嘛,然后在批处理文件里写入删除命令(在java程序关闭后)
第3个回答  2009-08-11
我试过了,jar也是可以删的,可能你指定的路径不对。
相似回答