线程

来源:互联网 发布:珍宝岛战役 知乎 编辑:程序博客网 时间:2024/06/01 16:07

进程:每个进程都有独立的代码和数据空间,进程间的切换会有较大的开销,一个进程包含一个或多个线程。(进程是资源分配的最小单位)

线程:同一类线程共享代码和数据空间,每个线程有独立的运行栈和程序计数器(PC),线程切换开销小。(线程是cpu调度的最小单位)

线程的创建,有两种方法,一种是继续Thread类,另外一种是实现Runable接口

一、继续Thread类
下面是一个简单的例子

package com.zl.thread;/** * @author zl * @descrption 线程 * @time 2017.05.02 */class MyThread extends Thread {    private String threadName;    public MyThread(String threadName) {        this.threadName = threadName;    }    public void run() {        for (int i = 0; i < 5; i++) {            System.out.println(threadName + "运行 : "+i);        }    }}public class MyThreadTest {    public static void main(String[] args) {        MyThread thread1 = new MyThread("Thread1");        MyThread thread2 = new MyThread("Thread2");        thread1.start();        thread2.start();    }}

运行结果如下:

Thread2运行 : 0
Thread2运行 : 1
Thread2运行 : 2
Thread2运行 : 3
Thread2运行 : 4
Thread1运行 : 0
Thread1运行 : 1
Thread1运行 : 2
Thread1运行 : 3
Thread1运行 : 4

再运行一次,则会得到不同的结果,每次运行的结果不一定相同

Thread2运行 : 0
Thread1运行 : 0
Thread1运行 : 1
Thread1运行 : 2
Thread1运行 : 3
Thread1运行 : 4
Thread2运行 : 1
Thread2运行 : 2
Thread2运行 : 3
Thread2运行 : 4

以上是两个线程thread1和thread2运行,这就引出了另一个概念,多线程。

多线程是指在同一程序中有多个顺序流在执行。从程序运行的结果可以发现,多线程程序是乱序执行

二、实现Runnable接口(推荐)

package com.zl.thread;/** * @author zl * @descrption 线程 * @time 2017.05.02 */class MyThread implements Runnable {    private String threadName;    public MyThread(String threadName) {        this.threadName = threadName;    }    public void run() {        for (int i = 0; i < 5; i++) {            System.out.println(threadName + "运行 : "+i);        }    }}public class MyThreadTest {    public static void main(String[] args) {        new Thread(new MyThread("Thread3")).start();        new Thread(new MyThread("Thread4")).start();    }}

运行结果如下:

Thread3运行 : 0
Thread4运行 : 0
Thread3运行 : 1
Thread4运行 : 1
Thread3运行 : 2
Thread4运行 : 2
Thread3运行 : 3
Thread4运行 : 3
Thread4运行 : 4
Thread3运行 : 4

同样的,再次运行结果不一定相同。

实现Runnable接口比继承Thread类所具有的优势

1):适合多个相同的程序代码的线程去处理同一个资源
2):可以避免java中的单继承的限制
3):增加程序的健壮性,代码可以被多个线程共享,代码和数据独立
4):线程池只能放入实现Runable类线程,不能直接放入继承Thread的类

0 0
原创粉丝点击