JAVA多线程——Thread和Runnable的区别

时间:2022-03-25 17:34:33

首先谈一下进程和线程的概念。

进程:进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体,我们称其为进程。也就是说,进程是拥有一定资源的,正在运行的程序。

线程:线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源。也就是说,线程是进程的实体,并且他们可以利用进程的资源。


进程和线程的区别:

进程作为分配资源的基本单位,而把线程作为独立运行和独立调度的基本单位。

由于线程比进程更小,基本上不拥有系统资源,故对它的调度所付出的开销就会小得多,能更高效的提高系统内多个程序间并发执行的程度。


在java中实现多线程,有两种方法。

1.继承Thread类。

class MyThread extends Thread {

...

@Override
public void run() {
...
}
}
启动线程:

MyThread mt = new MyThread();
mt.start();

2.实现Runnable接口。

class MyThread implements Runnable {

...

@Override
public void run() {
...
}
}
启动线程:
MyThread mt = new MyThread();Thread t = new Thread(mt);t.start();

那么这两种方法到底有什么区别呢?

总结如下:

1.继承Thread由于Java的单继承,具有一定的缺陷,即不灵活。

2.实现Runnable接口较于灵活,并且更易于多个线程操作同一个类里的变量,即共享变量更加易于实现。


利用Runnable实现资源共享:

MyThread mt = new MyThread();
Thread t1 = new Thread(mt);
Thread t2 = new Thread(mt);
t1.start();
t2.start();
可以看到,这里的线程所执行的都是mt,是同一个实例,所以他们可以共同操作mt对象的变量,实现资源共享。


而用继承Thread的方法:

MyThread mt1 = new MyThread();
MyThread mt2 = new MyThread();
mt1.start();
mt2.start();
可以看出来,这里线程执行的是不同的对象,分别是mt1和mt2。除非他们内部操作的变量是static的,否则就是操作不同的变量。