线程表示一条单独的执行流,它有自己的程序执行计数器,有自己的栈。下面,我们通过创建线程来对线程建立一个直观感受,在Java中创建线程有两种方式,一种是继承Thread,另外一种是实现Runnable接口,我们先来看第一种。继承ThreadJava中java.lang.Thread这个类表示线程,一个类可以继承Thread并重写其run方法来实现一个线程,如下所示:
public class HelloThread extends Thread { @Override public void run() { System.out.println(“hello”); }}
关于线程,我们需要知道,它是有成本的。创建线程需要消耗操作系统的资源,操作系统会为每个线程创建必要的数据结构、栈、程序计数器等,创建也需要一定的时间。此外,线程调度和切换也是有成本的,当有当量可运行线程的时候,操作系统会忙于调度,为一个线程分配一段时间,执行完后,再让另一个线程执行,一个线程被切换出去后,操作系统需要保存它的当前上下文状态到内存,上下文状态包括当前CPU寄存器的值、程序计数器的值等,而一个线程被切换回来后,操作系统需要恢复它原来的上下文状态,整个过程被称为上下文切换,这个切换不仅耗时,而且使CPU中的很多缓存失效,是有成本的。当然,这些成本是相对而言的,如果线程中实际执行的事情比较多,这些成本是可以接受的,但如果只是执行本节示例中的counter++,那相对成本就太高了。另外,如果执行的任务都是CPU密集型的,即主要消耗的都是CPU,那创建超过CPU数量的线程就是没有必要的,并不会加快程序的执行。
线程
最新推荐文章于 2022-12-24 21:37:24 发布