多线程
运行在操作系统之上的每个应用程序,都会占用一个独立的进程(process),而进程内又允许运行多个线程(thread),这意味着一个程序可以同时执行多个任务的功能
在Java中实现多线程:Thread类,Runnable接口
在基于线程的多任务而处理环境中,线程是执行特定任务的可执行代码的最小单位;
多任务
当今的操作系统绝大部分都是基于多任务的操作系统;
多任务操作系统的最大特点,是可以同时运行多个程序;
由于操作系统支持时间片轮换算法,使得用户感觉多个程序在同时运行,似乎有多个CPU在起作用。
进程与线程的区别
进程是指系统中正在运行中的应用程序,它拥有自己独立的内存空间;
线程是指进程中一个执行流程,一个进程中允许同时启动多个线程,他们分别执行不同的任务;
线程与进程的主要区别在于:每个进程都需要操作系统为其分配独立的内存地址空间,而同一进程中的所有线程在同一块地址空间中,这些线程可以共享数据,因此线程间的通信比较简单,消耗的系统开销也相对较小。
线程状态
新建状态(New):使用new关键字创建线程对象,仅仅被分配了内存;
就绪状态(Ready):线程对象被创建后,等待它的start方法被调用,以获得CPU的使用权;
运行状态(Running):执行run方法,此时的线程的对象正占用CPU;
睡眠状态(Sleeping):调用sleep方法,线程被暂停,睡眠时间结束后,线程回到就绪状态,睡眠状态的线程不占用CPU;
死亡状态(Dead):run方法执行完毕后,线程进入死亡状态;
阻塞状态(Blocked):线程由于某些事件(如等待键盘输入)放弃CPU,暂停运行,直到线程重新进入就绪状态,才有机会转到运行状态;
相关词汇说明
单 词 |
说 明 |
thread |
线,线程 |
runnable |
可追捕的,可猎取的 |
current |
当前的,最近的 |
sleep |
睡,睡眠 |
yield |
屈服,屈从 |
interrupted |
中断的,被阻止的 |
daemon |
后台程序 |
wait |
等待,等候 |
notify |
通报 |
synchronized |
同步的
|
Thread类
主线程示例
public class MainThreadDemo {
public static void main(String[] args) {
//获得当前运行的线程
Thread tMain = Thread.currentThread();
System.out.println("当前运行的线程是:" + tMain);
try {
for (int i = 0; i < 5; i++) {
System.out.println(i);
Thread.sleep(2000); //使当前线程休眠2秒
}
}
catch (java.lang.InterruptedException ie) {
ie.printStackTrace();
}
}
}
在Java中要实现线程,最简单的方式就是扩展Thread类,重写其中的run方法,方法原型如下:
public void run()
如:
public class MyThread extends Thread {
public void run() {
……
}
}
Thread类中的run方法本身并不执行任何操作,如果我们重写了run方法,当线程启动时,它将执行run方法。
Runnable接口
java.lang.Runnable接口中仅仅只有一个抽象方法:
public void run();
也可以通过实现Runnable接口的方式来实现线程,只需要实现其中的run方法即可;
Runnable接口的存在主要是为了解决Java中不允许多继承的问题;
使用Runnable接口可以使语法的自由度更高。