您的位置 首页 java

Java基础知识之线程的基本概念

线程 的基本概念

本节,我们介绍 Java 中线程的一些基本概念,包括创建线程、线程的基本属性和方法、共享内存及问题、线程的优点及成本。

创建线程

线程表示一条单独的执行流,它有自己的程序执行 计数器 ,有自己的栈。

下面,我们通过创建线程来对线程建立一个直观感受。在Java中创建线程有两种方式:一种是继承 Thread ;另外一种是实现Runnable接口。

1.继承Thread

Java中 java.lang .Thread这个类表示线程,一个类可以继承Thread并重写其run方法来实现一个线程,如下所示:

public class HelloThread extends Thread {

@Override

public void run() {

System.out.println(“hello”);

}

}

HelloThread这个类继承了Thread,并重写了run方法。run方法的方法签名是固定的,public,没有参数,没有返回值,不能抛出受检异常。run方法类似于单线程程序中的main方法,线程从run方法的第一条语句开始执行直到结束。

定义了这个类不代表代码就会开始执行,线程需要被启动,启动需要先创建一个HelloThread对象,然后调用Thread的start方法,如下所示:

public static void main(String[] args) {

Thread thread = new HelloThread();

thread.start();

}

我们在main方法中创建了一个线程对象,并调用了其start方法,调用start方法后,HelloThread的run方法就会开始执行,屏幕输出为:

hello

为什么调用的是start,执行的却是run方法呢?start表示启动该线程,使其成为一条单独的执行流,操作系统会分配线程相关的资源,每个线程会有单独的程序执行计数器和栈,操作系统会把这个线程作为一个独立的个体进行调度,分配时间片让它执行,执行的起点就是run方法。

如果不调用start,而直接调用run方法呢?屏幕的输出并不会发生变化,但并不会启动一条单独的执行流,run方法的代码依然是在main线程中执行的,run方法只是main方法调用的一个普通方法。怎么确认代码是在哪个线程中执行的呢?Thread有一个 静态方法 currentThread,返回当前执行的线程对象:

public static native Thread currentThread();

每个Thread都有一个id和name:

public long getId()

public final String getName()这样,我们就可以判断代码是在哪个线程中执行的。修改HelloThead的run方法:

@Override

public void run() {

System.out.println(“thread name: “+ Thread.currentThread().getName());

System.out.println(“hello”);

}

如果在main方法中通过start方法启动线程,程序输出为:

thread name: Thread-0

hello

如果在main方法中直接调用run方法,程序输出为:

thread name: main

hello

调用start后,就有了两条执行流,新的一条执行run方法,旧的一条继续执行main方法,两条执行流并发执行,操作系统负责调度,在单CPU的机器上,同一时刻只能有一个线程在执行,在多CPU的机器上,同一时刻可以有多个线程同时执行,但操作系统给我们屏蔽了这种差异,给程序员的感觉就是多个线程并发执行,但哪条语句先执行哪条后执行是不一定的。当所有线程都执行完毕的时候,程序退出。

2.实现Runnable接口

通过继承Thread来实现线程虽然比较简单,但Java中只支持单继承,每个类最多只能有一个父类,如果类已经有父类了,就不能再继承Thread,这时,可以通过实现java.lang.Runnable接口来实现线程。Runnable接口的定义很简单,只有一个run方法,如下所示:

public interface Runnable {

public abstract void run();

}一个类可以实现该接口,并实现run方法,如下所示:

public class HelloRunnable implements Runnable {

@Override

public void run() {

System.out.println(“hello”);

}

}

仅仅实现Runnable是不够的,要启动线程,还是要创建一个Thread对象,但传递一个Runnable对象,如下所示:

public static void main(String[] args) {

Thread helloThread = new Thread(new HelloRunnable());

helloThread.start();

}

无论是通过继承Thead还是实现Runnable接口来创建线程,启动线程都是调用start方法。

想要了解更多Java基础知识,点击连接和小编一起学习吧!!!

文章来源:智云一二三科技

文章标题:Java基础知识之线程的基本概念

文章地址:https://www.zhihuclub.com/189056.shtml

关于作者: 智云科技

热门文章

网站地图