进程与线程的区别
进程
进程简单的来说就是在内存中运行的应用程序,一个进程可以启动多个线程。
比如在windows中一个运行EXE文件就是一个进程。
线程
同一个线程中的进程共用相同的地址空间,同时共享进程所拥有的内存和其他资源。
线程Demo-继承Thread类
首先我们我们继承java.lang.Thread类来创建线程。
public class TestThread {
public static void main(String[] args) {
System.out.println("主线程ID是:" + Thread.currentThread().getId());
MyThread my = new MyThread("线程1");
my.start() ;
MyThread my2 = new MyThread("线程2") ;
/**
* 这里直接调用my2的run()方法。
*/
my2.run() ;
}
}
class MyThread extends Thread {
private String name;
public MyThread(String name) {
this.name = name;
}
@Override
public void run() {
System.out.println("名字:" + name + "的线程ID是="
+ Thread.currentThread().getId());
}
}
主线程ID是:1
名字:线程2的线程ID是=1
名字:线程1的线程ID是=9
线程Demo-实现Runnable接口
除了继承java.lang.Thread类之外,我们还可以实现java.lang.Runnable接口来创建线程。
public class TestRunnable {
public static void main(String[] args) {
System.out.println("主线程的线程ID是"+Thread.currentThread().getId());
MyThread2 my = new MyThread2("线程1") ;
Thread t = new Thread(my) ;
t.start() ;
MyThread2 my2 = new MyThread2("线程2") ;
Thread t2 = new Thread(my2) ;
/**
* 方法调用,并不会创建线程,依然是主线程
*/
t2.run() ;
}
}
class MyThread2 implements Runnable{
private String name ;
public MyThread2(String name){
this.name = name ;
}
@Override
public void run() {
System.out.println("线程"+name+"的线程ID是"+Thread.currentThread().getId());
}
}
主线程的线程ID是1
线程线程2的线程ID是1
线程线程1的线程ID是9
优雅的终止线程
有三种方法可以终止线程,如下:
- 使用退出标识,使线程正常的退出,也就是当run()方法完成后线程终止。
- 使用stop()方法强行关闭,这个方法现在已经被废弃,不推荐使用
- 使用interrupt()方法终止线程。