一、什么是线程?什么是进程?
进程:我们的电脑上的每个软件都可看作一个进程,以一个浏览器为例。
线程:线程可以看作是浏览器上打开的一个网页,一个网页就是一个线程。多线程的存在让我们可以在同一时间进行多个动作,比如边听歌边聊天。
我们执行java程序,开启jvm,就是开了一个进程。
二、多个线程是同时运行的吗?
这个要看你的电脑处理器是几核的,如果一核处理器,那么多个线程就会被安排快速的交替执行。多核处理器,会让几个线程同时进行。
三、创建多线程
创建多线程有两种方式,一般都这样说。但是创建多线程只能通过Thread类,那为什么还要说有两种,等下说,我们先看怎么创建线程。
首先说明线程的执行步骤:thread对象调用start()方法,strat()方法自动 调用run()方法,run()方法中写的线程的业务逻辑,从而实现线程的执行单元
(1)实现Runnable接口,重写run()方法
//Runnable的源码 public interface Runnable{ public void run(); } //实现Runnable接口 public class RunnableImpl implement Runnable{ private int i; public Runnable(int i){ this.i=i; } public void run(){ System.out.println(i); } }
public class ceshi{
public static void main(String[] arg){
RunnableImpl runnableImpl=new RunnableImpl(2);
Thread thread=new Thread(runableImpl,"threadName");
//开启线程
thread.start();
}
}
(2)继承Thread类,重写run()方法(Thread类在源码中也是实现了Runnable接口)
//继承thread类 public class ThreadE extends Thread{ //这个成员变量不是设置线程名字的,只是用来打印用的 private String threadname; public ThreadE(String threadname){ this.threadname=threadname; } public void run(){ System.out.println(threadname); } } public class ceshi2{ public static void main(String[] arg){ ThreadE threadE=new ThreadE("这是继承Thread类实现的"); Thread thread=new Thread(threadE);
//开启线程 thread.start(); } }
上文提到的,我们对创建线程的方式到底是一种还是两种存在疑问。现在进行说明:
在JDK中代表线程的只有Thread类,所以创建线程之能通过Thread类。上面的两种方法可以说是对线程的实现。我们观察到,上面两种方法中,最终实现线程都要通过"new Thread()"。
说明new Thread()中的参数 :
Thread类中有几个构造方法,我们最常见的是这个 :
Thread(Runnable target,String ThreadName);
第一个参数是实现Runnable接口的类的实例,第二个参数是为线程设置名字。也可以不设置名字,那就是用Thread(Runnable target);
在Thread类中run()方法中,有如下源码:
@Override public void run(){ //如果有Runnable的实现类的对象,就用对象的run()方法 if(target!=null){ target.run(); } }
如果直接new Thread()来创建线程,就会调用run()方法,如果实现了Runnable类或者继承了Thread类,就会调用目标类中重写后的run()方法。