在了解多线程的时候,有必要清楚的知道线程与进程的区别。
进程,可被看做一个程序或者一个应用。
线程,操作系统中能够进行运算调度的最小单位,负责执行当前进程中程序的执行。线程是进程的子集,一个进程可以有一个或多个线程,每条线程执行不同的任务,也可以将这个应用程序称为多线程程序;
多线程即一个程序中有多个线程在同时执行。
为什么要使用多线程?
多任务操作,不会产生混乱任务.就像取银行大厅存取钱.如果不排队都在一个窗口取,也能取,但排队在多个窗口取会不会更好呢。
如实在java中实现多线程?
一、 直接继承Thread类,如下:
1.定义一个类继承Thread类;
2.重写run方法;
3.创建子类对象,即创建线程对象;
4.调用start方法,开启线程并让线程执行,同时还会告诉JVM执行run方法;
代码如下:
package com.java.ThreadDemo;
public class ThreadDemo {
public static void main(String[] args) {
//创建自定义线程对象
myThread mt = new myThread(“新的线程!”);
//开启新线程
mt.start();
for (int i = 0; i < 100; i++) {
System.out.println(“main线程!”+i);
}
}
}
//自定义线程类
class myThread extends Thread{
//定义指定线程名称的构造方法
public myThread(String name){
//调用父类的 String 参数的构造方法,指定线程的名称
super(name);
}
// 重写 run 方法,完成该线程执行的逻辑
public void run(){
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName()+":正在执行!" + i);
}
}
}
结果如下:
在Thread类中可以调用start()和run(),这两种方法有何区别?
start()方法用来启动新的线程,使该被创建的线程变为可运行状态。当调用run()方法的时候只会在原来的线程中调用,没有新的线程启动,start()方法才会启动新的线程。如果调用了Thread的run()方法,它的行为就和普通方法一样,直接运行run()方法。
二、 实现Runnable接口,如下:
- 定义类实现Runnable接口;
- 覆盖接口中的run方法;
- 创建Thread类的对象;
- 将Runnable接口的子类对象作为参数传递给Thread类的构造函数;
- 调用Thread类的start方法开启线程;
整体代码如下:
package com.java.ThreadDemo;
public class RunnableDemo {
public static void main(String[] args) {
//创建线程执行目标类对象
Runnable runn = new myRunnable();
//将 Runnable 接口的子类对象作为参数传递给Thread 类的构造函数
Thread thread = new Thread(runn);
Thread thread2 = new Thread(runn);
//开启线程
thread.start();
thread2.start();
for (int i = 0; i < 10; i++) {
System.out.println("main线程:正在执行!" + i);
}
}
}
//自定义线程执行任务类
class myRunnable implements Runnable{
@Override
public void run() {
for (int i = 0; i <10; i++) {
System.out.println("我的线程:正在执行!"+i);
}
}
}
结果如图:
实现Runnable的好处:
实现 Runnable 接口避免了单继承的局限性,所以较为常用。实现Runnable 接口的方式,更加的符合面向对象,线程分为两部分,一部分线程对象,一部分线程任务。继承 Thread 类,线程对象和线程任务耦合在一起。一旦创建 Thread 类的子类对象,既是线程对象,有又有线程任务。实现 runnable 接口,将线程任务单独分离出来封装成对象,类型就是 Runnable 接口类型。Runnable 接口对线程对象和线程任务进行解耦。
该使用Thread还是Runnable?
Thread和Runnable的实际是继承关系,无论是使用Thread还是Runnable都会new Thread,再执行run()方法。如果只是简单的执行一个任务,还是实现Runnable接口比较简单。