一、进程,线程,任务
(1)、进程(process)
- 什么是进程: 进程,程序运行的实例。我们经常听到的就是“杀死某个进程,或者关掉某个进程”。当打开window的任务管理器时,我们可以看到很多进程。
- 进程和程序之间的关系
关掉某个程序,我们在Linux中经常是换了个说法杀死某个进程,(kill + 进程号)。
因此进程和程序的关系可以看成,进程是程序的动态描述。一个java程序被运行后实质上就是启动了一个java虚拟机进程。
2,线程(Thread)
进程是程序向操作系统申请资源的基本单位。在后台运行的QQ是一个进程,在后台运行的谷歌也是一个进程。而线程则是进程中可执行的最小基本单位。因此一个进程中可以有多个线程。如果餐厅是一个进程,那么里面正在工作的员工则是不同的线程,有的是服务员为客人进行点餐,有的是送餐的,有的是厨师……当这个餐厅处于运营状态时,里面的工作人员都有自己相应的工作,同时也有不同的状态,但他们都是在这个餐厅使用着这个餐厅的资源进行自己的工作。
3,任务
线程所要完成的计算就是任务,特定的线程总是需要完成特定的任务。正如餐厅里的厨师任务是做菜,服务员的任务是为客人点单、送菜,清洁人员的任务是做好清洁工作。
二、多线程编程
1,多线程编程的简单介绍
- 什么是多线程编程
多线程编程就是以线程为基本抽象单位的一种编程范式。 - 线程的简单使用
Java标准库类java.lang.Thread
就是Java平台对线程的实现的解决。
(1),上面提到每个线程有自己的任务,而在代码中,就需要将任务处理逻辑代码放入Thread类的run()实例方法中直接实现或者是用该方法进行调用相应的任务处理逻辑代码。
(2),运行一个线程实质就是让java虚拟机执行该线程的run()方法,而达到任务处理逻辑的实现。而线程何时能被运行则是由线程调度器(Scheduler)
决定的。start()方法的调用结束并不意味着线程的执行,线程可能稍后执行,也可能永远不执行。
(3),创建和使用线程的简单大致步骤:
创建一个Thread类或者其子类——>将任务逻辑代码放入重写的run()方法里面——>启动该线程
(4),代码
Thread的构造有两种方式
a,以定义Thread类子类的方式创建线程
package thread;
public class ExtendThreadDemo extends Thread{
@Override
public void run(){
System.out.println("线程一:以定义Thread子类的方式创建线程" +Thread.currentThread().getName());
}
}
package thread;
import java.util.Date;
public class SimpleJavaThread {
public static void main(String[] args) {
//以定义Thread子类的方式创建线程
Thread ExtendThread = new ExtendThreadDemo();
//以创建Runnable接口实例的方式创建线程
// Thread RunnableThread = new Thread(new CreateRunnable());
//开始运行
ExtendThread.start();
}
}
b,以创建Runnable接口实例的方式创建线程
package thread;
public class CreateRunnable implements Runnable{
@Override
public void run() {
System.out.println("线程二:以创建Runnable接口实例的方式创建线程!");
}
}
package thread;
import java.util.Date;
public class SimpleJavaThread {
public static void main(String[] args) {
//以定义Thread子类的方式创建线程
//Thread ExtendThread = new ExtendThreadDemo();
//以创建Runnable接口实例的方式创建线程
Thread RunnableThread = new Thread(new CreateRunnable());
//开始运行
//ExtendThread.start();
RunnableThread.start();
}
}
注意:
(1),当run()方法执行结束,相应的线程的运行也就结束了。然后线程占用的资源就会被Java虚拟机进行垃圾回收。
(2),线程属于“一次性用品”,即一个程序里面,一个线程只使用一次start方法,不能再次调用start方法再次运行该线程。如果多次调用就会抛出
(3),在Java平台中,线程就是一个对象,但是创建线程对象比创建其他类型的对象消耗的资源要更多。
我们都知道在创建对象时,需要给对象分配内存资源,而线程不仅需要内存资源,java虚拟机还需要分配给每个线程调用栈所需的空间。
(4),Java不会阻止你自己执行run方法,但是一般避免这样做,一般由Java虚拟机自己去调用。
- 执行线程
Java中的任意一段代码总是由一个特定的线程负责执行的,那么这个线程就相应的被称为这段代码的执行线程。 - 当前线程
任意一段代码都可以通过调用Thread.currentThread()
来获取这段代码的线执行线程,这个线程就被称为当前线程。
2,Runnable接口的简单介绍
- Runnable接口可以看做是对任务进行的抽象,任务的处理逻辑就放在run方法中。因此Runnable接口只定义了一个:
run
方法。
@FunctionalInterface
public interface Runnable {
/**
* When an object implementing interface <code>Runnable</code> is used
* to create a thread, starting the thread causes the object's
* <code>run</code> method to be called in that separately executing
* thread.
* <p>
* The general contract of the method <code>run</code> is that it may
* take any action whatsoever.
*
* @see java.lang.Thread#run()
*/
public abstract void run();
}
Thread
类就是对Runnable
接口的实现。
run
方法具体实现:
@Override
public void run() {
if (target != null) {
target.run();
}
}
参考:《Java多线程编程》