在了解线程之前,要先了解进程,进程,就是正在运行中的程序,你可能已经见过进程。按ctrl +alt + del 启动任务管理器,它有一个选项卡就是进程,点击一下,确实是电脑中正在运程的程序。当一个应用程序启动后,比如QQ, 它就会在内存中开辟一片空间,这片空间就是进程。启动后,程序就要进行执行,执行的就是线程。线程就是进程中控制程序执行的一个控制单元。线程只是一片内存中的空间,它不负责程序执行。负责程序执行的是线程。一个进程中可以有多个线程,这就叫多线程。360安全卫士就是一个多线程。当我们启动360以后,它就会在内存中开发辟一片空间,Windows 资源管理器中多了360,但它什么都没有做,仅仅是启动了一个程序。 当我点击立即体验时,可以看到正在体验,这时再点击电脑清理,它会发现电脑正在进行清理,这两个功能在同时执行,但是都在一个程序中,这两个功能就是线程,我们可以同时启动多个线程。线程是负责程序执行。多线程的启动,就是为了运行各自的内容,这个内容可以称之为多线程执行的任务。
多线程,其实是cpu在各个程序的各个线程中进行快速的切换,执行代码,由于切换非常快,给我们错觉是各个程序在同时执行。如果太多的多线程在同时执行,cpu在各个线程中来回切换的频率就会变小,电脑有时就很卡。 一个解决办法,就是增加cpu,这就是电脑2核,4核的由来。一个核执行一个程序,那就是真正同时运行。但是如果开多个程序,还是有问题。因为一个是内存不足,二是,线程切换确实消耗资源。这也是多线程的弊端。
java 中创建多线程要用到Thread类,并且它的步骤如下
1, 定义一个子类继承Thread 类
2,覆盖Thread 类的run 方法。我们开启线程的目的就是执行一段代码,一个任务,我们定义了线程,如果它没有任务执行,也没有什么用。线程 执行的任务就是写在run 方法中。我们开启这个线程要做什么事情,就写到定义的子类的run方法中。
3,创建子类的对象
4,调用对象的start的方法 开启线程,调用run方法,执行任务
public class ComputeArea { public static void main(String[] args) { // 利用ChildThread子类创建子类对象 ChildThread c1 = new ChildThread("firstThread"); ChildThread c2 = new ChildThread("second"); // 调用子类对象的start方法开启线程,执行任务 c1.start(); c2.start(); } } // 定义一个子类 继承Thread 类 class ChildThread extends Thread { private String name; public ChildThread(String name) { this.name = name; } // 复写Thread 类的run方法, 在run方法中定义线程要执行的任务 public void run() { for (int i = 0; i < 10000; i++) { if (i % 100 == 0) { System.out.println(name); } } } }
开启多线程之后,我们怎么才能知道当前执行线程是哪个线程? Thread 类提供了一个静态方法currentThread() 就是返回当前执行线程的引用,再调用getName()方法,就可以获取到。把上面的System.out改成下面代码
System.out.println(name + Thread.currentThread().getName());