1.什么是线程?
在我们了解单线程和多线程之前,我们必须搞清楚什么是进程。
一个运行起来的程序就是一个进程!
那程序又是什么呢?
对程序的通俗定义就是:一段可执行的代码。
当我们执行一段Java程序时,就在java虚拟机(JVM)中形成了一个进程,一个进程可以包括多个线程。而单线程就是进程的一个基本运行单位。JVM通过在程序中执行main()方法,形成一个线程(主线程)。当main()方法结束后,JVM进程也随之结束。
我们平常执行的java程序大多是单线程程序。
2.什么是多线程?
之前提到过,一个进程可以包括多个线程,顾名思义,多线程就是多个单线程的集合!
通俗来说,单线程就是一个人做一件事,多线程是多个人做同一件事。
3.为什么要实现多线程?
对于多个单线程的进程来说,它们之间的内存块是相互独立的,这样进程之间的通信很不方便;但是对于一个多线程的进程来说,新开辟的线程并不分配新的内存空间,而是与原来的线程共享内存空间,这样,线程之间的通信很方便,程序执行速度更快。
4.如何实现多线程?
Java当中实现多线程的基本方法有两种:继承java.long.Thread类或java.long.Runnable接口
其中,java.long.Thread类是继承java.long.Runnable接口而来的。
继承Thread类:我们通过继承Thread类,重写其中的 run()方法实现多线程。但在main()方法中我们不能直接调用run()方法,而是通过调用start()方法来间接调用run()方法。代码如下
public class DoubleThread extends Thread{
public Process pro; //*声明Process对象*
public static void main(String [] args) {
Process pro=new Process(1);
//*循环生成多个线程*
for(int i=0;i<=10;i++)
{
DoubleThread dt=new DoubleThread(pro);
dt.start(); //*调用start方法*
}
}
public DoubleThread(Process p) {
this.pro=p;
}
public void run() //*重写run方法*
{
while(pro.i<=20)
{
pro.i++;
System.out.println(Thread.currentThread()+"i="+pro.i);
}
}
}
Process类如下
public class Process {
public int i;
public Process(int i) {
this.i=i;
}
}
继承java.long.Runnable接口
Attention:如果自己的主函数类已经继承一个类,就无法再继承 Thread,必须继承接口Runnable,此时必须重写所有方法;代码如下`
package Thread2;
import Thread.Process;
public class DThread implements Runnable{
/*
* 如果自己的类已经继承一个类,就无法再继承 Thread,必须继承接口Runnable,此时必须重写所有方法;
*/
public Process pro;
public static void main(String [] args) {
Process pro=new Process(1);
for(int i=0;i<=10;i++)
{
DThread dt=new DThread(pro);
/*
* 实例化一个Thread类对象 用于接受自己创建的类
* 传入一个Runnable target对象后 Thread的run方法就会调用target的run方法
*/
Thread th=new Thread(dt);
th.start();
}
}
public DThread(Process p) {
this.pro=p;
}
public void run() {
while(pro.i<=20)
{
pro.i++;
System.out.println(Thread.currentThread()+"i="+pro.i);
}
}
此外,我们还可以这样来写:
new Thread(new Runnable(){
public void run() {
while(pro.i<=20)
{
pro.i++;
System.out.println(Thread.currentThread()+"i="+pro.i);
}
}}).start();